2016-07-25 11 views
2

Ich habe Text wie dieserRegex: Warum funktioniert diese negative Vorausschau nicht?

real:: a 
real :: b 
real c 

jetzt möchte ich das die wirklich passen, ohne :: gefolgt, und in diesem Fall möchte ich nur die dritte echte anzupassen. so habe ich versucht, regex mit Look-Ahead-

real\s*(?!::) 

Aber diese Spiele

real :: b 
real c 

Für \s* bedeutet null oder mehr \s, warum real :: b wird abgestimmt werden?

Update

Dank Wiktor Stribiżew. Verwenden von regex101 Debugging-Tool. Wir finden backtrack macht das Ding kompliziert.

kam ich mit einer anderen Aufgabe auf, die ähnlich ist, aber ich kann

real (xx(yy)) :: a 
real (zz(pp)):: b 
real (cc(rr)) c 

wieder nicht lösen, ich will real (cc(rr)) die folgenden ohne :: ist übereinstimmen.

real\s*\(.*?\)+(?!\s*::) 

Dies ist, was ich versucht habe, aber fehlgeschlagen. Schauen Sie sich regex debug an, es liegt auch an Backtrack. Aber wie macht man das richtig?

Antwort

5

Sie müssen die \s* in die Look-Ahead setzen:

real(?!\s*::) 

Siehe die regex demo

Die real\s*(?!::) Streichhölzer real weil die real Streichhölzer real, dann sind die \s* Matches 0 oder mehr Leerzeichen, dann wird der Look-Ahead schlägt das Spiel bei der ::und die Engine Backtracks, das heißt, es befreit den Raum mitabgestimmtund versucht, die Zeichenfolge erneut abzugleichen. Da die \s* eine leere Zeichenfolge übereinstimmen kann, wird die real vor :: b zugeordnet.

Siehe regex debugger scheme at regex101 zeigen, was hinter den Kulissen vor sich geht:

enter image description here

+0

Ok, aber können Sie erklären, warum mein regex scheitern? – user15964

+0

Ich fügte die Erklärung hinzu, warum das '\ s *' außerhalb des Lookahead mit dem zweiten Fall übereinstimmt und fügte den Graphen von regex101 hinzu, der den Prozess illustriert. –

+0

@ user15964 Die Behauptung ist eine "Negative Lookahead Assertion". Dies bedeutet, dass es behauptet, dass der Inhalt nicht unmittelbar nach dem Platzieren erscheint. –

-1

die https://regex101.com/r/yP3xV9/1 sehen, zu verstehen, warum Ihre regex versagt.

Im Grunde ist es passend real mit Null Räumen, die durch etwas gefolgt, die nicht ::

Verwandte Themen