RegEx - Dokument mehrzeilig durchsuchen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von hate_regex.

    RegEx - Dokument mehrzeilig durchsuchen

    Hallo Community,

    ich möchte gerne aus einem Seitenquellcode alle Scriptteile filtern.
    Dazu verwende ich aktuell den RegEx

    VB.NET-Quellcode

    1. <script(.*)script>


    Leider findet mein Pattern nur einzeilige Ergebnisse. Ich habe es mit dem Flag \s versucht, leider gibt es dann überhaupt keine Matches mehr.

    Kann jemand aushelfen?

    Vielen Dank
    @ErfinderDesRades
    Danke für deine schnelle Antwort.

    Ich habs mit

    VB.NET-Quellcode

    1. Dim pattern As String = "<script(.*)\s?script>" '<script(.*)?script>
    2. For Each Match As Match In Regex.Matches(input, pattern, RegexOptions.Singleline)
    3. Console.WriteLine(Regex.Escape(Match.Value))
    4. Next

    versucht, aber das bringt keine Änderung.

    Hab mich an msdn.microsoft.com orientiert, leider blicke nicht wirklich durch - im Gegenteil. Das Ergebnis verwirrt.

    @Mono - Oh jaaaa! :(

    Edit: Vielen Dank euch beiden, dass funktioniert!

    Kleinigkeit noch:
    Es werden im Ergebnis Backslashs hinzugefügt.
    Beispielsweise wird aus <script class dann <script\ class
    Wie das?

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

    ich hab nicht deinen Quelltext, und auch nicht viel Lust, für dich da herumzuprobieren (weil ich brauch auch immer viele Versuche).
    Aber ich kann dir meinen Regextester empfehlen, der unterstützt auch Single-Line-Option und so Kram: Regextester - OpenSource

    Klar kannste auch annere Regextester aussm Inet nehmen, nur ist in diesem Falle SingleLine wichtig, und das unterstützen nicht alle.
    Nochmal danke.
    Das AgilityPack wäre eine (danke dafür), ich würde dies jedoch eher bei umfangreicheren Projekten verwenden.
    Hier würde ich es gerne per RegEx lösen.

    Dim pattern As String = "<article(.*?)article>"
    For Each Match As Match In Regex.Matches(input, pattern, RegexOptions.Singleline)
    Console.WriteLine(Regex.Escape(match.Value))
    Next

    Damit klappt es nun auch zuverlässig, jedoch verstehe die Ursache des neuen Problems nicht:
    Jedem Leerzeichen im String und für jeden Punkt wird ein Backslash eingefügt. Am Ende jeder Zeile wird ein \n angehängt.

    Aus
    <a href="http://google.com" title="Google Suche">

    wird somit
    <a\ href="http://google\.com"\ title="Google\ Suche">\n


    Ich verstehe nicht wirklich woher es kommt und wie ich es vermeide. Ich hab schon mit diversen RegExTestern erfolglos herumgespielt.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „hate_regex“ ()

    escapen ist generell das Zufügen oder ersetzen bestimmter Zeichen in einem String, um Parser-Missverständnisse abzuwenden, wenn der String in einer embedded Sprache eingesetzt werden soll.
    Regex ist ja eine Sprache, und es gibt sehr viele Zeichen, die innerhalb der Regex-Sprache was anderes bedeuten als sie selbst.

    Etwa (3+4)*2als Suchpattern findet ja mitnichten iwelche Vorkommnisse von (3+4)*2, sondern iwas ganz anneres, weil eben die Zeichen ()+* in der Regex-Sprache was anneres bedeuten.
    Um also wirklich alle Vorkommnisse von (3+4)*2 aufzufinden, musste diese Steuerzeichen escapen, damit der Regex-Parser weiß, dasses in dem Fall keine Steuerzeichen sind:
    \(3\+4\)\*2
    Ich habe also durch Voranstellen von \ aus zB * die "Escape-Sequenz" gebildet: \*.

    Und diese Änderungen der Eingabe kann die Regex-Klasse auch selbst ausführen, mit der Regex.Escape - Methode.

    Und das Prinzip des escapens findest du in glaub jeder Sprache.
    Etwa in VB kann man ein " innerhalb eines Strings darstellen, indem man ihn verdoppelt

    VB.NET-Quellcode

    1. Messagebox.Show("""") 'Ausgabe: "

    Gleiches gilt für Sql, xml, und auch den Format-String der String.Format()-Funktion muss man als "embedded Language" auffassen, und kennt reservierte Zeichen, die ggfs. zu escapen sind.

    Aber das ist alles abseits von deim Problem, denn du willst deine gefundenen Matches ja garnet als Eingabe für einen weiteren Regex verwenden.
    Also escape sie auch nicht.