webentwicklung-frage-antwort-db.com.de

RegEx, um eine bestimmte Zeichenfolgenkonstante auszuschließen

Kann ein regulärer Ausdruck verwendet werden, um eine beliebige Zeichenfolge mit Ausnahme einer bestimmten Zeichenfolgekonstante abzugleichen, sagen wir "ABC"? Ist es möglich, nur eine bestimmte String-Konstante auszuschließen? Vielen Dank für Ihre Hilfe im Voraus.

109
V Govind

Sie müssen eine negative Lookahead-Behauptung verwenden.

(?!^ABC$)

Sie könnten zum Beispiel Folgendes verwenden.

(?!^ABC$)(^.*$)

Wenn dies in Ihrem Editor nicht funktioniert, versuchen Sie dies. Es wurde getestet, um in Ruby und Javascript zu funktionieren:

^((?!ABC).)*$
132

In .NET können Sie die Gruppierung zu Ihrem Vorteil wie folgt verwenden:

http://regexhero.net/tester/?id=65b32601-2326-4ece-912b-6dcefd883f31

Sie werden feststellen, dass:

(ABC)|(.)

Wird alles außer ABC in der 2. Gruppe greifen. Klammern umgeben jede Gruppe. (ABC) ist also Gruppe 1 und (.) Ist Gruppe 2.

Also greifst du einfach die 2. Gruppe wie folgt in einem Ersatz:

$2

Oder sehen Sie sich in .NET die Groups-Auflistung in der Regex-Klasse an, um ein wenig mehr Kontrolle zu erhalten.

Ähnliches sollte auch in den meisten anderen Regex-Implementierungen möglich sein.

UPDATE: Ich habe hier einen viel schnelleren Weg gefunden: http://regexhero.net/tester/?id=997ce4a2-878c-41f2-9d28-34e0c5080e

Es wird immer noch eine Gruppierung verwendet (ich kann keinen Weg finden, der keine Gruppierung verwendet). Diese Methode ist jedoch über 10-mal schneller als die erste.

5
Steve Wortham

Dies ist nicht einfach, es sei denn, Ihre Regexp-Engine unterstützt dies speziell. Der einfachste Weg wäre die Verwendung einer Option für negative Übereinstimmungen, zum Beispiel:

$var !~ /^foo$/
    or die "too much foo";

Wenn nicht, müssen Sie etwas Böses tun:

$var =~ /^(($)|([^f].*)|(f[^o].*)|(fo[^o].*)|(foo.+))$/
    or die "too much foo";

Das sagt man im Grunde "wenn es mit nicht-f beginnt, kann der Rest alles sein; wenn es mit f, nicht-o beginnt, kann der Rest alles sein; andernfalls, wenn es fo startet, sollte das nächste Zeichen kein anderes o "sein.

4
derobert

Sie könnten einen negativen Lookahead oder so etwas verwenden:

^([^A]|A([^B]|B([^C]|$)|$)|$).*$

Vielleicht könnte es ein bisschen vereinfacht werden.

4
Adam Crume

Versuchen Sie diesen regulären Ausdruck:

^(.{0,2}|([^A]..|A[^B].|AB[^C])|.{4,})$

Es werden drei Fälle beschrieben:

  1. weniger als drei beliebige Zeichen
  2. genau drei Zeichen, während entweder
    • das erste ist nicht A oder
    • das erste ist A, aber das zweite ist nicht B, oder
    • das erste ist A, das zweite B, aber das dritte ist nicht C
  3. mehr als drei beliebige Zeichen
2
Gumbo