RegEx Pattern verschachteln (Alternative)

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Kangaroo.

    RegEx Pattern verschachteln (Alternative)

    Hi,
    wie die Überschrift es schon ausdrückt, suche ich eine Alternative für

    VB.NET-Quellcode

    1. m = Regex.Replace(Regex.Replace(m, "\n", ""), "\t", "")


    das m wird auch über ein Regex erzeug/gefiltert vom Quelltext einer Webseite.
    In dem m sind halt Zeilenumbrüche und Tabs vorhanden, die wollte ich weg haben.

    Optimal wäre es, wenn ich nur eine Zeile bräuchte, ich bekomme es aber nicht hin.

    VB.NET-Quellcode

    1. Dim m As String = Regex.Match(quelltext, "td height=""20"">([^<]+)").Groups(1).Value
    2. m = Regex.Replace(Regex.Replace(m, "\n", ""), "\t", "")


    Vielleicht hat jemand ein TIP für mich?

    Danke
    Hay,

    Falls du den Quelltext mit einem Webclient Downloaden willst dann gehts alles in einer Zeile so:


    VB.NET-Quellcode

    1. Dim m As String = Regex.Match(New Net.WebClient().DownloadString("http://www.google.de/"), "td height=""20"">([^<]+)").Groups(1).Value : m = Regex.Replace(Regex.Replace(m, "\n", ""), "\t", "")


    Mfg Kevin.
    @Kevvin
    danke für die Antwort, aber das ist nicht was ich wissen wollte.

    Nochmal:
    Ich habe ein Quelltext, wo ich bereits die gesuchte Stelle mit hilfe von RegEx finde.
    Es handelt sich um eine "MsgBox" was durch Javascript erzeugt wird.
    .
    .
    <script type="text/javascript">Zeilenumbruch
    tab tab htmlAlert(Zeilenumbruch
    tab tab tab tab tab ''Zeilenumbruch
    tab tab tab tab tab , '<strong>Sie haben nicht bestätigt!</strong>'Zeilenumbruch
    tab tab tab tab tab tab tab tab );Zeilenumbruch
    </script>
    .
    .
    Mein Regex sieht nun so aus

    VB.NET-Quellcode

    1. msg = Regex.Match(quell, "htmlAlert\(([^\)]+)").Groups(1).Value
    2. msg = Regex.Replace(Regex.Replace(Regex.Replace(msg, "\n", ""), "\t", ""), "^\s", "")
    3. msg = Regex.Replace(Regex.Replace(msg, " '|'", ""), ",", "")
    4. msg = Regex.Replace(Regex.Replace(Regex.Replace(msg, "\/", ""), "<strong>", ""), "^\s", "")
    5. RichTextBox1.Text = msg


    Das Ergebnis sieht dann so aus:
    Sie haben nicht bestätigt!

    Ich bin ein Anfänger was RegEx betrifft, aber ich glaube es gibt bestimmt eine elegantere Art.
    Kann mir jemand vielleicht etwas helfen um den Pattern schöner zu gestalten.

    Ich habe bereits so ziemlich viele varianten ausprobiert, aber manchmal bleibt ein Zeilenumbruch oder ein Leerzeichen über.
    z.B.
    _Sie haben nicht bestätigt! (Leerzeichen am Anfang)

    oder
    _(Zeilenumbruch)
    Sie haben nicht bestätigt!

    Da ich mit der Nachricht weiterarbeiten muss für diverse If-Anweisungen muss der Text natürlich ohne Zeilenumbruch und/oder Leerzeichen am Anfang stehen.
    Zur Info die Nachricht kann sich auch ändern, aber der Text vom Quelltext hat immer die gleiche Struktur.

    Danke für eure Hilfe.
    Das Einzige was Du an zusätzlicher Info benötigst ist der Ausdruck \s, welcher für alle Art von Whitespaces steht (Leerzeichen, Tab, Zeilenumbruch) um den von Dir gesuchten String schon bei der Suche näher einzugrenzen. Mach folgendes:
    - füg überall in Deiner Pattern wo Whitespaces stehen könnten \s* ein
    - entferne aus deinem ermittelten Satz Leerzeichen am Anfang und Ende mit der String-Funktion Trim

    Zum Beispiel für einen ähnlichen String wie hier:

    VB.NET-Quellcode

    1. Dim s As String = "<script type=""text/javascript"" > " & vbCrLf & " <strong> irgendwas Wichtiges </strong>" & vbCrLf & ");" & vbCrLf & "</script>"
    2. Dim m As Match = Regex.Match(s, "<script type=""text/javascript""\s*>\s*<strong>\s*(.*)\s*</strong>\s*\);\s*</script>")
    3. MessageBox.Show(":" & m.Groups(1).Value.Trim & ":")
    Hallo Kangaroo,

    leider ergab dein Lösungsvorschlag auch kein brauchbares Ergebnis.

    Nun hab ich es so gelöst. Ich weiß nicht warum mir das nicht gestern schon eingefallen ist.

    VB.NET-Quellcode

    1. msg = Regex.Match(quell, "htmlAlert\(([^\)]+)").Groups(1).Value
    2. msg = Regex.Match(msg, "strong>([^<]+)").Groups(1).Value


    Das Ergebnis ist so wie es brauche.

    Danke trotzdem für die Hilfe.

    MfG
    newbie

    Kangaroo schrieb:

    Es war auch kein C&P Code , sondern nur ein Beispiel für einen ähnlichen String.
    Sry, das sollte kein Schlaumeierspruch sein von mir. Ich glaube eher, dass ich dein Pattern nicht verstanden habe :)

    Kangaroo schrieb:

    Aber ich finde es eh besser dass Du auf eine eigene Lösung gekommen bist ;)

    Danke
    Hallo nochmal.

    Mit sowas hatte ich ja bereits das Thema angefangen, deshalb dachte ich mir, dass ich nicht extra noch neues Thema deswegen eröffne.

    Aus einem Quelltext einer .html Seite finde ich eine Textstelle die ich brauche:

    newbie schrieb:

    VB.NET-Quellcode

    1. Dim m As String = Regex.Match(quelltext, "td height=""20"">([^<]+)").Groups(1).Value




    Das Ergebnis sieht so aus:

    HTML-Quellcode

    1. "
    2. tab tab tab 1.265
    3. tab tab tab tab Einträge
    4. "


    (Ich hoffe die "tab" sind klar. Das sollen Tabstops darstellen. Woher ich das weiß? Ich habe diesen Teilabschnitt bei MS Word eingefügt und die Absätze einblenden lassen.)

    Nun möchte ich das Ergebnis auf das hier reduzieren:
    "1.265 Einträge"

    ich bekomme es einfach nicht hin.
    Mit diesem Code:

    VB.NET-Quellcode

    1. m = Regex.Match(m, "([^*\s]+)").Groups(1).Value


    Bekomme ich nur das hier hin:
    "1.265" der "Einträge" fehlt.

    Ich habe Zahlreiche andere Versionen probiert, schaffe es aber nicht.
    Wie müsste der Pattern richtig aussehen? Kann mir bitte einer helfen?

    Danke

    Kangaroo schrieb:

    Wieso brauchst Du "Einträge" im Ergebnis wenn Du eh weist dass es da steht ?

    Weil sich der Text je nach Fund ändert. D.h. es kann auch mal "Stück", "Mitglieder" heißen. deshalb sollte der Pattern so sein, dass es auf jeden Fall diesen Text noch mitnimmt.

    Danke für die Antwort.

    Funktioniert leider nicht.
    Das Ergebnis ist leer. Jetzt hab ich noch nicht mal die Zahl.
    Dann wandel das halt entsprechend ab, so schwiergig ist das doch nicht

    VB.NET-Quellcode

    1. Dim pattern As String = "td height=""20"">\s*(?<zahl>[^<\s]+)\s+(?<wort>[^<\s]*)"
    2. Dim m As Match = Regex.Match(quelltext, pattern)
    3. Dim zahl As String = m.Groups("zahl").Value
    4. Dim wort As String = m.Groups("wort").Value
    Danke das funktioniert super.

    nur mal als feedback.

    td height=""20"">\s* = Das ist klar, suche die Stelle und solange Leerzeichen kommen...?
    (?<zahl>[^<\s]+) = Egal was für ein Zeichen kommt wird in die Gruppe zahl geschrieben...bis das erste Leezeichen kommt
    \s+ = Solange Leerzeichen kommen, such weiter
    (?<wort>[^<\s]*) = Egal was für ein Zeichen kommt wird in die Gruppe wort geschrieben...bis wieder ein Leerzeichen vorkommt

    Verständnisfrage: Zeile 2, das "+" wofür steht es?
    Zeile 4, das "*" wofür steht es an der Stelle?
    Zeilen 2 und 4, werden nur die Zeichen/Gruppen in den runden Klammern ausgegeben?
    "^" heißt doch String beginn oder Zeilenanfang?
    "<" was macht das Zeichen?

    Danke für die Hilfe

    MfG
    newbie
    Hallo ich nochmal,

    nächste Frage.
    Meistens sind ja mehrere Funde in so einem Quelltext enthalten, wie kann man mit der Regex nun die zweite, dritte, vierte... Fundstelle anzeigen bzw. ausgeben?
    Ziel ist es, die Ergebnisse alle als eine Art Liste auszugeben um mit den Ergebnissen weiterzu rechnen.

    Danke