2016-04-19 24 views
1

Was ist der Unterschied zwischen ist:Negative Lookahead für Regex

^(?!.*baa)[abc]*$ 

und

^(?!baa)[abc]*$ 

Was die Rolle des .* ist. Ich weiß, dass es ein beliebiges Zeichen 0 oder mehr bedeutet, aber warum fängt das zweite Zeichenfolgen wie cccaabaa ein, die verworfen werden sollten?

Antwort

1

Der Unterschied zwischen ihnen ist:

  1. ^(?!.*baa) erfordert, dass baa nicht überall im Eingang bei
  2. ^(?!baa) erfordert, dass baa nicht des Eingangs
der Start sein werden

Die .* erlaubt alles zwischen Startzu seinund baa.

+0

danke. Folgt man dieser Argumentation, warum müssen wir '. *' after nicht hinzufügen, damit wir sagen können, dass dies nicht das Ende der Eingabe ist, wie in '^ (?!. * baa *.) [abc] * $' – ocram

+1

@ocram ja - '. *' Nach 'baa' macht keinen Unterschied. Wenn Sie 'baa' an einer beliebigen Stelle * außer am * Ende verhindern wollten, verwenden Sie'^(?!. * Baa.) ', Was nach' baa' mindestens (mindestens) ein Zeichen erfordert – Bohemian

0

^[abc] * $ (* baa?!). - Startet von der aktuellen Position (hier aufgrund ^ Anfang), die gesamte Zeichenfolge verbraucht und Backtracking dann, wenn zu finden dort in kein baa überall ist Zeichenfolge. Nun ist die Position, von der Übereinstimmung von Look-Ahead gestartet (hier beginnen) zu überprüfen, was folgt, ist combiantion von a, b und c

enter image description here

^(?! baa) [abc] * $ - Startet von der aktuellen Position (hier beginnend mit ^), um zu prüfen, was folgt ist nicht baa. baa kann überall sein, aber nicht im Start.

enter image description here

0

(?! ) ist ein negativer Look-Ahead: es gibt eine Gruppe, die nicht mithalten können.

In ^(?!baa)[abc]*$ suchen Sie nach einer Zeichenfolge, die nicht mit "baa" beginnt und nur Zeichen in einem b oder c hat: cccaabaa übereinstimmen: es beginnt nicht mit "baa".

In ^(?!.*baa)[abc]*$, Sie suchen eine Zeichenfolge, die mit allem, was nicht von baa folgenden starten, und haben nur Zeichen ab oder C: cccaabaa passt nicht, weil es beginnt mit „cccaa von baa folgenden“