Regex String matchen

  • Allgemein

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von nafets3646.

    Regex String matchen

    Hey,
    ich suche gerade nach einer Möglichkeit, Strings (nicht allgemein Zeichenfolgen sondern Strings, wie man sie z.B. in VB im Code schreibt) mit Regex zu matchen. Ich bin mir ziemlich sicher, schonmal ein Thread hier oder auf einer anderen Plattform dazu gesehen zu haben, jedoch war ich nicht in der Lage diesen zu finden (wenn man nach Strings in Verbindung mit Regex sucht, bringt das nichts, da der Begriff "String" in warscheinlich jeder Frage über Regex irgendwo enthalten ist). Wenn jemand diesen Thread finden könnte, fände ich es super, wenn er/sie ihn hier verlinken könnte, ansonsten würde ich mich auch freuen, wenn ihr mir mit möglichen Lösungen weiterhelfen könntet :). Beispiele, welche gematcht werden sollen:

    VB.NET-Quellcode

    1. "abc"
    2. "abc""abc"
    3. """"
    4. "abc""""abc"""
    5. usw.

    Generell geht es also darum, dass das Pattern in der Lage sein sollte, doppelte Anführungszeichen zu ignorieren, einfache Anführungszeichen aber zu beachten.

    MfG Stefan
    Mist, ich dachte da gerade an den hier, aber da steht leider doch nichts über Strings in VB-Code...
    Also, wenn das Ganez nicht gerade durch & getrennt ist, dann ginge evtl das hier(gerade aus'm Kopf geklatscht - also ungetestet):

    VB.NET-Quellcode

    1. Dim Strings = Regex.Replace(Input, "(?<=^[^""]*?""[^""]+?)""""(?=""[^""]*?$)" , "$0")
    Aber das matcht doch nicht solch einen String, oder?

    VB.NET-Quellcode

    1. "asdfsd""sa""""""adf""rwsd""fal""""""""""fjw"""""


    //EDIT:
    Nope, wird net gematcht:

    C#-Quellcode

    1. ​MessageBox.Show(string.Join(", ", Regex.Matches(@"asdfsd""sa""""""adf""rwsd""fal""""""""""fjw""""", @"(?<=^[^""]*?""[^""]+?)""""(?=""[^""]*?$)").OfType<Match>().Select(m => m.Value)));

    gibt nichts aus

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

    Nee, leider nicht. :/
    Vielleicht geht es auch einfach, wenn du in einer Schleife durchgehst. Ein ähnliches Problem hatte mal Faxe, bei dem wir am Schluss auf die Holzfällermethode zurückgegriffen haben.
    Sah dann so aus:

    VB.NET-Quellcode

    1. Private Function SplitBrokenRational(term$) As Tuple(Of String, String)
    2. Dim Level = 0
    3. Dim Lines = 0
    4. For index = 0 To term.Length - 1
    5. Select Case term(index)
    6. Case Is = "("c
    7. Level += 1
    8. Case Is = ")"c
    9. Level -= 1
    10. Case Is = "/"c
    11. If Level = 0 Then Return New Tuple(Of String, String)(term.Substring(0, index - 1), term.Substring(index + 1))
    12. Lines += 1
    13. End Select
    14. Next
    15. Return Nothing
    16. End Function

    Bei dir wäre es einfach eine Boolean-Variable, die nach dem Löschen eines " auf True gesetzt wird und das erneute Löschen verhindert, nach dem sie dann wieder auf False gesetzt wurde.
    Na gut. Es geht auch einfacher, wie ich gemerkt habe ^^ :

    VB.NET-Quellcode

    1. Dim Strings = Regex.Replace(Input, """""" , """")
    2. Strings = String.SubString(1, Strings.Length - 2)

    @nafets3646 Guckst du. ;)
    @ichduersie
    Ich bin doch kein Regex-Anfänger ;( , sonst würde ich schon bei viel einfacheren Problemen fest stecken.

    @All
    Ich habe jetzt eine Lösung für das Problem gefunden (sie ist sicher nicht ideal, aber sie funktioniert):

    C#-Quellcode

    1. //Soll gematcht werden (valider String); ohne Escapes: "a""bc d"
    2. MessageBox.Show(string.Join(", ", Regex.Matches(@"""a""""bc d""", @"^""[^""]*(""""[^""]*)*?(""$)").OfType<Match>().Select(m => m.Value)));
    3. //Soll nicht gematcht werden (nicht valider String); ohne Escapes: "a""bc " d"
    4. MessageBox.Show(string.Join(", ", Regex.Matches(@"""a""""bc "" d""", @"^""[^""]*(""""[^""]*)*?(""$)").OfType<Match>().Select(m => m.Value)));

    Dieses Pattern funktioniert bisher wie erwartet, jedoch bin ich für Verbesserungsvorschläge jederzeit offen :) .
    Entschuldigung, dass ich eure Zeit in Anspruch genommen hab, obwohl ich das Problem, so wie es derzeit aussieht, selber lösen konnte.

    MfG Stefan

    //EDIT:
    @Higlav
    Es geht darum, bei einer Zeichenfolge zu bestimmen, ob es sich um einen String handelt oder nicht. Hätte ich es ohne Regex machen können, hätte ich sicher nen Mini-Einzeiler geschrieben :P .

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

    @ErfinderDesRades
    Das Pattern sah auf jeden Fall vielversprechend aus, ich war aber leider nicht in der Lage, dieses so umzuformen, dass das machte, was es soll, ohne, dass es deutlich länger als die bisherigen Patterns wurde.
    Jedoch hat mich dein Pattern auf eine Idee gebracht, welche nicht nur funktioniert sondern auch noch viiel kürzer und deutlich weniger kompliziert ist: @"^""([^""]|"""")*""$" (^"([^"]|"")*"$)
    Diese Lösung ist eigentlich sogar extrem simpel:
    Teil 1: ^"" (^") matcht den Anfang eines Strings am Anfang des zu untersuchenden Strings
    Teil 2: ([^""]|"""")* (([^"]|"")*) besteht aus 2 Teilen:
    Teil 2.1: [^""]|"""" ([^"]|"") matcht entweder ein Zeichen, welches kein Anführungszeichen ist oder ein doppeltes Anführungszeichen (man könnte aus dem [^""] auch ein [^""]+ oder ähnliches machen)
    Teil 2.2: (<Expression>)* matcht eine beliebige Anzahl der in der Klammer befindlichen Expression
    Teil 3: ""$ ("$) matcht das Ende eines Strings am Ende des zu untersuchenden Strings

    Hoffentlich hilft das anderen Leuten etwas weiter :) .

    MfG Stefan

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „nafets3646“ ()