2016-03-19 13 views
1

Glücklich Samstag,Regex Lookarounds für eine Gruppe funktioniert nicht

ich mich, wenn Stackoverflow Nutzer mir einen Anhaltspunkt über eine bestimmte Regex ..

(^visite\d+)(?!\D) 

Die obige regex gut funktioniert geben könnte. .

Er sagt, dass:

visite12345 --> is a good anwser (the string does match) 
visite1a  --> is not a good anwser (the string doesn't match) 

jedoch für:

visite12345a --> It doesn't work. 

der Tat ist der Ausgang visite1234, während ich die gleiche Antwort bekommen möchten, dass für visite1a (string entspricht nicht) ...

Ich benutze http://regexr.com/ meine regexp zu testen.

Haben Sie eine Idee, wie? Vielen Dank.

+1

Es fängt 'visite1234' in Ihrem ersten als auch Eingang. Was versuchst du zu machen? – anubhava

Antwort

1

Der Regex (^visite\d+)(?!\D) entspricht visite am Anfang des Strings, gefolgt von einer oder mehreren Ziffern, die nicht mit einer Nicht-Ziffer gefolgt werden sollten.

Das "Problem" ist, dass die Engine innerhalb \d+ Muster zurückverfolgen kann und es kann 2 Ziffern übereinstimmen, wenn die dritte nicht mit einer nonigitit gefolgt wird.

Die beste Lösung ist es, die tatsächlichen Anforderungen zu überprüfen und das Muster anzupassen.

Wenn die Ziffern die letzten Zeichen in der Zeichenfolge sind, ersetzen Sie den Lookahead durch den Anker $.

Eine allgemeine Lösung für diese ist mit einer Erfassungsgruppe in einem positiven Look-Ahead und ein Rückreferenzierung das Unter-Pattern Atom machen, und stellen Sie sicher, dass die Look-Ahead zu so etwas wie (?![a-zA-Z]) geändert wird - fehlschlagen, wenn ein Brief) ist:

/^visite(?=(\d+))\1(?![a-z])/i 

Siehe regex demo

oder wenn eine Wortgrenze der Ziffern folgen soll, \b anstelle des Look-Ahead verwenden (dh Ziffern sollte mit einem Buchstaben, eine Ziffer oder einem Unterstrich folgen):

/^visite\d+\b/ 

Siehe another demo

+0

Es löste das Problem perfekt. Und es ist einfach ... Ich hätte selbst darüber nachdenken sollen ... Danke! – nerotulip