Text aus Textbox Filtern <w:t>alles hier Zwischen</w:t>

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von Higlav.

    Text aus Textbox Filtern <w:t>alles hier Zwischen</w:t>

    Hallo Comm,
    Wie Die Überschrift schon Gut sagt möchte ich aus einen Text alles zwischen <w:t> und </w:t> bekommen

    Ich habe es Bereits versucht indem ich mir alles vor dem ersten > Lösche und alles nach dem Nächten < Jedoch funktioniert Das natürlich nicht wenn ich mehrmals < oder > davor schon in dem Text habe und somit kahm Ich nicht zum gewünschten Ergebnis ._.

    Beispieltext:

    Quellcode

    1. <w:t>V16</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW
    2. w:w="468" w:type="pct"/><w:tcBorders><w:top
    3. w:val="nil"/><w:left w:val="nil"/><w:bottom
    4. w:val="nil"/><w:right
    5. w:val="nil"/></w:tcBorders><w:shd w:val="clear"
    6. w:color="auto" w:fill="A6A6A6"/><w:noWrap/><w:vAlign
    7. w:rsidR="00EA24BC" w:rsidRPr="00EA24BC"
    8. w:rsidRDefault="00EA24BC"
    9. w:rsidP="00EA24BC"><w:pPr><w:rPr><w:rFonts w:ascii="Arial"
    10. w:hAnsi="Arial" w:cs="Arial"/><w:color
    11. w:val="000000"/></w:rPr></w:pPr><w:r w:rsidRPr="00EA24BC"><w:rPr><w:rFonts
    12. w:ascii="Arial" w:hAnsi="Arial"
    13. w:cs="Arial"/><w:color
    14. w:val="000000"/></w:rPr>
    15. <w:t>V19</w:t></w:r></w:p></w:tc>


    Und es Soll Raus Kommen:
    V16 V19 wenn möglich sogar mit einen "|" als Trennung (V16 | V19)

    hat jemand eine Idee wie Ich das am besten Umsetzen kann?
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „Ruerte“ ()

    Hallo,

    Du brauchst also den Wert aus Zeile 1 und den aus Zeile 14?

    da ist Regex eigentlich ganz gut dafür. Am Anfang steigt man da aber oft nicht so ganz durch.
    Also genrell zu Regex findest du hier was --> RegEx Tutorial - Blutige Anfänger und Fortgeschrittene
    und hier --> msdn.microsoft.com/en-us/library/hs600312(v=vs.110).aspx
    RegEx.Matches() --> msdn.microsoft.com/en-us/library/b49yw9s8(v=vs.110).aspx

    ein cooles Tool zum ausprobieren ist z.b. das hier --> debuggex.com/
    Ich checks auch manchmal noch nicht so ganz aber daswird mit der Zeit.

    EDIT: Du brauchst eigentlich Regex.Matches() hab den Link mal hinzugefügt.
    Wer fragt, ist ein Narr für eine Minute. Wer nicht fragt, ist ein Narr sein Leben lang.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Snaptu“ ()

    Ruerte schrieb:

    V16 1
    Speicher den ganzen Text mal als HTML-Datei ab und dann dies:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Me.WebBrowser1.DocumentText = IO.File.ReadAllText("C:\Temp\test.html")
    3. MessageBox.Show(Me.WebBrowser1.Document.Body.InnerText)
    4. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Habe Leider Nicht Die Möglichkeit den code als HTML zu Speichern da ich auf den Benutzten System als User Ohne Schreib rechte arbeiten muss!
    Zudem würde die HTML V161 zurückgeben und ich könnte Diese V161 soweit ich es weiß Doch nicht auseinander halte!

    @Snaptu
    Muss ich mich mal Genauer Mit beschäftigen, das könnte ja Interessant werden, danke schon mal
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    @TVX
    Ich nutze die vb dll von OpenXmlSdk um .docx Daten über die XML einzulesen und zu Bearbeiten.
    Habe keine funktionale andere Möglichkeit gefunden und effizient .docx Daten zu Auszulesen.

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Text.RegularExpressions
    3. Imports DocumentFormat.OpenXml
    4. Imports DocumentFormat.OpenXml.Packaging
    5. Imports DocumentFormat.OpenXml.Wordprocessing
    6. Dim i As Integer
    7. While i <> ListBox5.Items.Count
    8. Document = TextBox3.Text & "\" & ListBox5.Items(i)
    9. Dim wordDoc As WordprocessingDocument = WordprocessingDocument.Open(Document, True)
    10. Using (wordDoc)
    11. Dim docText As String = Nothing
    12. Dim sr As StreamReader = New StreamReader(wordDoc.MainDocumentPart.GetStream)
    13. Using (sr)
    14. docText = sr.ReadToEnd
    15. End Using
    16. Form2.RichTextBox1.Text == (docText)
    17. End Using
    18. i = i + 1
    19. End While
    20. MsgBox("Fertig")


    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    Ruerte schrieb:

    Habe Leider Nicht Die Möglichkeit den code als HTML zu Speichern
    Dann nimm ihn als Stringvariable:

    VB.NET-Quellcode

    1. Me.WebBrowser1.DocumentText = MEINE_STRING_VARIABLE
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Es gibt Trotzdem das Problem das ich dann als Ergebnis V161 bekomme anstatt V16 1
    Ich wüsste nicht wie Ich bei Mehreren Einträgen die einzelnen von einander trennen kann / soll!
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    Ich hätt's jetzt mal so probiert(blind getippt):

    VB.NET-Quellcode

    1. String.Join("|", Regex.Matches("(?<=<w:t>).+?(?=</w:t>)", MyText).Cast(Of List(Of Match)).ConvertAll(Function(x) x.Value))

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim s As String = ""
    3. Dim parts() As String = RichTextBox1.Text.Split({"<w:t>"}, StringSplitOptions.None)
    4. For i As Integer = 0 To parts.Length - 1
    5. s &= RichTextBox1.Text.Split({"<w:t>"}, StringSplitOptions.None)(i).Split({"</w:t>"}, StringSplitOptions.None)(CInt(("0"))) & vbNewLine
    6. Next
    7. MsgBox(s)
    8. End Sub
    @TVX Danke Dir :thumbsup:
    Ok hört sich jetzt zwar bescheuert an weils sicherlich ne einfach Sache ist aber Wie kann ich alles vor dem ersten <w:t> und alles nach dem letzten </w:t> in einer RichTextBox1 löschen?
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    Mit

    VB.NET-Quellcode

    1. RichTextBox1.Text = Regex.Match("<w:t>.+?</w:t>", RichTextBox1.Text, RegexOptions.SingleLine).Value

    Müsst's funktionieren.

    PS: Hat mein Snippet nicht hingehauen?
    @Higlav
    bin mit deinen Snippet leider nicht klar gekommen X/
    Dein Regex funktioniert leider auch nicht so wie er Glaube soll, zumindest enthält meine RichTextBox1 keinen Text mehr danach ._.
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    Hmm. Dann die Holzfällermethode: Pattern mal durch "\<w\:t\>(.|\n)+?\<\/w\:t\>" ersetzen und die Option hinten rausnehmen.
    Das erste Snippet kann ich leider nicht kontrollieren - gerade zu wenig Zeit.
    @Higlav
    Gleiches Ergebnis, Leere RichTextBox1 bei beiden Arten

    VB.NET-Quellcode

    1. RichTextBox1.Text = Regex.Match("\<w\:t\>(.|\n)+?\<\/w\:t\>", RichTextBox1.Text).Value
    2. RichTextBox1.Text = Regex.Match("<w:t>.+?</w:t>", RichTextBox1.Text, RegexOptions.SingleLine).Value

    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    Kannst es auch so machen , wenn de jetz in contains noch en Buchstaben oder Wort eingibst
    werden nur noch alle angezeigt die das enthalten !

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim s As String = ""
    3. Dim parts() As String = RichTextBox1.Text.Split({"<w:t>"}, StringSplitOptions.None)
    4. For i As Integer = 0 To parts.Length - 1
    5. If parts(i).Contains("V") Then'für V16 oder alle die auf en V drin haben
    6. s &= RichTextBox1.Text.Split({"<w:t>"}, StringSplitOptions.None)(i).Split({"</w:t>"}, StringSplitOptions.None)(CInt(("0"))) & vbNewLine
    7. End If
    8. Next
    9. MsgBox(s)
    10. End Sub
    @Higlav
    Deine Methode versuche ich Gleich auch nochmal

    @TVX
    Danke, da ich leider nicht so viel Ahnung von Splits habe wie müsste ich das ganze aufbauen das ich alles Zwischen <? und </w:rPr> lösche? Dabei soll auch </w:rPr>
    und <? Mitgelöscht werden.

    Gibt es eine Möglichkeit das nach nur jedem 6 Split ein vbNewLine genutzt wird, bzw. an welche stelle müsste ich Dies einsetzen?
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    @TVX : Bitte entschuldige, aber ich finde deine Vorgehensweise äusserst fragwürdig. Sachen wie CInt(("0")) bei Indices und StringSplitOptions.None beim ordinären Textsplitten sollte man vermeiden. Auch kann man die Aufgabe in einem Einzeiler abarbeiten, wie mein Snppet zeigt(gut, Pattern und Input sind vertauscht). Ich finde mehrzeilige Operationen für sowas Simples ziemlich unschön, zumal man es nicht mal gut lesen kann. Ich bin zum Beispiel strikt gegen das ständige Verwenden von Integern, weshalb ich auch das Textsplitten nciht mag...