Was bedeutet “[^][]”regex bedeuten?

Lesezeit: 3 Minuten

Was bedeutet ^regex bedeuten
Emanuil Russev

Ich habe es in der folgenden Regex gefunden:

\[(?:[^][]|(?R))*\]

Es passt eckige Klammern (mit ihrem Inhalt) zusammen mit verschachtelten eckigen Klammern an.

1646309646 679 Was bedeutet ^regex bedeuten
Kasimir und Hippolyte

[^][] ist eine Zeichenklasse, die alle Zeichen außer bedeutet [ and ].

Sie können die Flucht vermeiden [ and ] Sonderzeichen, da es für die PCRE, die Regex-Engine, die darin verwendet wird, nicht mehrdeutig ist preg_ Funktionen.

Seit [^] in PCRE falsch ist, ist dies die einzige Möglichkeit für die Regex zu analysieren ] befindet sich innerhalb der Zeichenklasse, die später geschlossen wird. Das gleiche mit der [ that follows. It can not reopen a character class (except a POSIX character class [:alnum:]) innerhalb einer Zeichenklasse. Dann das letzte ] ist klar; es ist das Ende der Zeichenklasse. Allerdings, ein [ outside a character class must be escaped since it is parsed as the beginning of a character class.

In the same way, you can write []] oder [[] oder [^[] ohne dem zu entkommen [ or ] in der Charakterklasse.

Hinweis: Seit PHP 7.3 können Sie den Inline-Modifikator xx verwenden, mit dem Leerzeichen auch innerhalb von Zeichenklassen ignoriert werden können. Auf diese Weise können Sie diese Klassen weniger zweideutig schreiben: (?xx) [^ ][ ] [ ] ] [ [ ] [^ [ ].

Sie können diese Syntax mit mehreren Regex-Varianten verwenden: PCRE (PHP, R), Perl, Python, Java, .NET, GO, awk, Tcl (Wenn Sie Ihr Muster mit geschweiften Klammern begrenzen, danke Donal Fellows), …

Aber nicht mit: Ruby, JavaScript (außer für IE < 9), …

Wie m.büttner feststellte, [^]] ist nicht zweideutig, weil ] ist der Erste Charakter, [^a]] wird gesehen als all das ist nicht a a gefolgt von einem ]. Haben a und ]müssen Sie schreiben: [^a\]] oder [^]a]

Insbesondere bei JavaScript erlaubt die Spezifikation [] als Regex-Token das noch nie Übereinstimmungen (mit anderen Worten, [] wird immer scheitern) und [^] als passende Regex irgendein Charakter. Dann [^]] wird gesehen als ein beliebiges Zeichen, gefolgt von a ]. Die tatsächliche Implementierung variiert, aber moderne Browser halten sich im Allgemeinen an die Definition in der Spezifikation.

Musterdetails:

\[          # literal [
(?:         # open a non capturing group
    [^][]   # a character that is not a ] or a [
  |         # OR
    (?R)    # the whole pattern (here is the recursion)
)*          # repeat zero or more time
\]          # a literal ]

In Ihrem Musterbeispiel müssen Sie dem letzten nicht entkommen ]

Aber Sie können dasselbe mit diesem Muster tun, das ein wenig optimiert und nützlicher ist, weil es als Untermuster wiederverwendbar ist (mit dem (?-1)): (\[(?:[^][]+|(?-1))*+])

(                     # open the capturing group
    \[                # a literal [
        (?:           # open a non-capturing group
            [^][]+    # all characters but ] or [ one or more time
          |           # OR
            (?-1)     # the last opened capturing group (recursion)
                      # (the capture group where you are)
        )*+           # repeat the group zero or more time (possessive)
    ]                 # literal ] (no need to escape)
)                     # close the capturing group

oder besser: (\[[^][]*(?:(?-1)[^][]*)*+]) das vermeidet die Kosten für einen Wechsel.

  • … aber du sollte Entkommen Sie diesen Sonderzeichen, da dies die Person, die Ihren Code verwaltet, zutiefst verwirrt. 🙂 Regex-Autoren neigen dazu, “kniffligen” Code zu mögen (ich habe mich dessen schuldig gemacht), aber kniffliger Code ist schwer verständlicher Code.

    – CDhowie

    24. Juli 2013 um 21:22 Uhr


  • Beachten Sie, dass der wichtige Punkt hier ist ] tritt als erstes Zeichen (nach der Negation) auf, weil leere Klassen nicht erlaubt sind.

    – Martin Ender

    24. Juli 2013 um 21:23 Uhr

  • @cdhowie: Vor allem, wenn du auch wo in JavaScript arbeitest [^] ist eine gültige Regex (bedeutet “beliebiges Zeichen”)

    – Tim Pietzcker

    24. Juli 2013 um 21:23 Uhr


  • @TimPietzcker Außer in IEs <9, wo [^] verhält sich wie PHP in dieser Antwort

    – Iskata

    24. Juli 2013 um 21:26 Uhr

  • @CasimiretHippolyte Es geht nicht darum, ob sie es sind fähig um die Regex zu analysieren, sondern darum, ob Sie die beabsichtigte Bedeutung Ihrer Regex überdeutlich gemacht haben oder nicht. Die meisten Sprachen halten Leerzeichen nicht für wichtig, aber wir verwenden sie großzügig, indem wir zum Beispiel Anweisungen in eine eigene Zeile stellen. Dies ist nicht zum Vorteil des Compilers, sondern zum Vorteil zukünftiger Betreuer. Dies ist ein weiterer solcher Fall, in dem es dem Compiler egal ist, aber der nächste Typ, der Ihren Code pflegt, wird es zu schätzen wissen, dass er nicht anhalten und versuchen muss, Ihre Absicht zu erraten.

    – CDhowie

    24. Juli 2013 um 21:39 Uhr

923260cookie-checkWas bedeutet “[^][]”regex bedeuten?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy