2010-06-03 19 views
21

ich meinen Kopf bin hämmern gegen eine Wand mit einem regulären Ausdruck. Ich versuche, einen Ausdruck zu definieren, die genau diesen Text ‚System‘ (Groß- und Kleinschreibung) ausschließt, kann aber das Wort ‚System‘ enthalten vorausgesetzt, es ist nicht nur das.Regex nicht gleich String

Beispiele:

  • Systems == INVALID
  • SYSTEM == INVALID
  • System == INVALID
  • SYSTÉM == INVALID
  • asd-System == Valid
  • asd-System asd == Valid
  • asd-System == Valid
  • System-
  • asd == Valid
  • asd == Valid

Antwort

38

Versuchen Sie folgendes:

^(?!system$) 

Oder dies die ganze Linie entsprechen:

^(?!system$).*$ 

Die Regex hat eine negative Vorausschau auf seinen Anfang, der nicht übereinstimmt, wenn "System" der gesamte String ist.

+0

Nur aus Neugier, wie funktioniert das?! Betreiber arbeiten? Ich habe das nie benutzt (obwohl ich ziemlich viel Regex verwendet habe, tendiere ich dazu, Lösungen zu finden, die "nicht" verwenden). – Alxandr

+1

Ahh, so einfach! Ich bin mir sicher, dass ich das versucht habe ...! Vielen Dank. – Kieron

+1

@Alxandr - es prüft, was Ihrer aktuellen Position folgt. Zum Beispiel passt 'c (?! 4)' zu c von 'Doc12', aber nicht von c zu' Doc42'. Ein Look-Around wird nicht erfasst, sodass ich mir keine Gedanken darüber machen muss, ob die Ziffer ersetzt werden soll oder ob die Randbedingung geprüft werden soll (wenn z. B. c das letzte Zeichen ist: "Doc"). – Kobi

4

abweisen, wenn es ^system$ Spiele (stellen Sie sicher, i-Flag EIN ist).

+0

Dies sollte die erste Option oder natürlich sein. Ich habe natürlich (und möglicherweise zu Unrecht) angenommen, dass das OP es nicht tun kann. – Kobi

1
^$|^.{1-5}$|.{7}|^[^s]|^.[^y]|^..[^s]|^...[^t]|[^e].$|[^m]$ 

Aber verwenden Sie Amarghoshs Antwort, wenn Sie können.

(wie auf Vorschlag aktualisiert)

+0

Sie haben wahrscheinlich '. {1,5}' gemeint. – Kobi

+0

heh, das habe ich geschrieben, ohne es zu testen. Ich bin irgendwie schockiert, dass es tatsächlich zuerst funktioniert hat. Die ersten beiden Klauseln sind jedoch überflüssig, so: | (. {8}) | (.^{1-6} $) (^ [^ s]) | (.^[^ Y]) | (^ .. [^ s]) | (^ ... [^ t]) |. ([^ e] $) | ([^ m] $) Nizza Spitze über?! obwohl - ich hatte nichts davon gehört. –

+0

oops. Diese Regex lässt "systuem" durch. (und scheitert an einer leeren Zeichenkette, die anscheinend akzeptabel ist?) versuchen Sie: ^ $ | ^. {1-5} $ |. {7} |^[^ s] | ^. [^ y] |^.. [^ s] |^... [^ t] | [^ e]. $ | [^ m] $ –