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?
Ok, aber können Sie erklären, warum mein regex scheitern? – user15964
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. –
@ user15964 Die Behauptung ist eine "Negative Lookahead Assertion". Dies bedeutet, dass es behauptet, dass der Inhalt nicht unmittelbar nach dem Platzieren erscheint. –