2016-06-18 9 views
0

Ich versuche, Zeichenfolgen zu entsprechen, die nicht passen das Muster name (CA) oder barbaz (UK). Ich scheine das Problem gelöst zu haben, die Antwort here verwenden, aber das ist, was ich begann mit, und ich frage mich, warum es nicht funktioniert:negierte Lookahead Verwirrung

var r1 = /^.+(?!\([A-Z]{2}\))$/; 

r1.test('foo'); //true 

r1.test('foo (US)'); //whoops -also true 

Von einem negierten Look-Ahead-Lese doc Ich habe gehofft, dass jeder String, dem nicht zB folgt (JP) würde zu einer Übereinstimmung führen, während alles, was ist gefolgt von z.B. (DE) würde fehlschlagen. (Nur das erstere wird erfüllt).

Ich dachte, vielleicht war die .+ Art alles, zunichte macht den Look-Ahead „raubend“, so habe ich versucht,

r2 = /^[^()]+(?!\([A-Z]+\))$/; 

r2.test('name (US)'); //false 

r2.test('foo('); //whoops -also false 

aber ich Dinge wie foo( müssen übereinstimmen.

Warum scheiterte mein erster Versuch?

Antwort

1

In Ihrem ersten Ausdruck verwendet die .+ die gesamte Zeichenfolge und dann wird die Vorausschau getestet - es passt nicht, da keine Zeichen mehr vorhanden sind. Um Ihr Ziel zu erreichen, können Sie /^(?!.+\([A-Z]{2}\)$).+$/ verwenden - zunächst prüfen, ob das unerwünschte Konstrukt nicht vorhanden ist, und dann die Übereinstimmung überprüfen.

Siehe https://regex101.com/r/aG7xZ0/1 mit Ihren Proben

+0

Danke für den Link. Könnten Sie näher erläutern, wie Sie $ verwendet haben? – KnewB

+1

Es wird einfach verwendet, um sicherzustellen, dass '(XX)' nur am Ende des Strings und nicht irgendwo in der Mitte abgeglichen wird, also wäre 'Hello (XX) World' gültig. –

+0

Cool Ich denke, dass deckt die eine in der Lookahead, aber dann gibt es '. + $' Am Ende? – KnewB