Regex - Problem Backreferenz

    • Offizieller Beitrag

    Hi,
    folgendes Problem:
    Ich möchte einen String auf Vorkommen eines Wortes (z.B. Apfel) untersuchen.
    Bedingung:
    Ist das Wort selbst in einem quotierten String (mit ' oder ") soll kein Match erfolgen.
    Vor dem Match, aber auch vor dem quotierten String, können andere Zeichen stehen.
    Ansatz:
    Match für das Wort(insensitiv): "(?i)apfel"
    Nun Backreferenz wegen Quotierung: "(?<!['\x22])(?i)apfel" (\x22 ist der Hex-Wert für ASCII des ")
    Klappt,
    gefunden wird Apfel in: xyz 123 Apfel
    nicht gefunden in: 'Apfel xyz  ODER xyz 'Apfel   ==>ABER
    gefunden in: ' Apfel xyz  
    Also Bedingung:
    keine Qoutierung UND (optional) kein anderes Zeichen nach der Quotierung.
    Jetzt kommt eine Stolperfalle, ich will also auf Backreferenzen unterschiedlicher Länge prüfen.
    Das geht aber nur, wenn es Toplevel-Referenzen sind.
    OK, wenn ich das als ODER-Option gestalte ist das gewährleistet.
    Neues Pattern: "(?<!(['\x22](.+?)|['\x22]))(?i)apfel"
    Das klappt im RegExprogramm (RegexBuddy) super, aber in AutoIt gibt das keinen Match.

    [autoit]

    Global $s[4] = ["xyz 123 Apfel","'Apfel xyz"," Apfel xyz","xyz ' Apfel"]
    For $i = 0 To UBound($s) -1
    ConsoleWrite($s[$i] & ' = ' & @TAB & StringRegExp($s[$i], "(?<!(['\x22](.+?)|['\x22]))(?i)apfel") & @CRLF)
    Next

    [/autoit]


    Irgendeine Idee?

  • Hmmm. di []-Zeichengruppen sind wohl nicht richtig umgesetzt... Darin werden, wie es aussieht keine Codes umgewandelt, sondern nur die Zeichen, die dort stehen, gesucht.

    Zitat

    Note that special characters do not retain their special meanings inside a set, with the exception of \\, \^, \-,\[ and \] match the escaped character inside a set.