2016-04-06 11 views
1

den folgenden Text Gegeben:Negative Look-Ahead-vs Positive Look-Ahead-Syntax

Mein Name ist foo.

Mein Name ist Bar.

Mit dem Ziel, jede Zeile zurückzukehren ist, die enthält oder nicht, einen bestimmten Teilkette enthält, die beide der folgenden positiven und negativen regex Muster verwendet werden können, um das gleiche Ergebnis zurückgeben:

Postive Vorgriffs-: ^(?=.*bar).*$My name is bar. kehrt

Negative Look-Ahead: ^((?!foo).)*$ kehrt My name is bar.

jedoch, warum die negative Vorschau braucht in mehreren Sätzen verschachtelt werden Klammern mit dem Qualifier . und dem Quantifizierer * getrennt durch die Klammern, während sie im positiven Lookahead benachbart sein können .*?

Antwort

3

Die negative Vorschau Notwendigkeit . und der quantifier * heißt eine temperiert gierigen Token in mehrere Sätze von Klammern mit dem Qualifier verschachtelt werden. Sie müssen es in diesem Szenario nicht verwenden.

Sie können einen normalen Look-Ahead auf dem anstelle der tempered greedy token Start verankert verwenden:

^(?!.*foo).*$ 

Siehe regex demo

Hier

  • ^ - entspricht die Lage zu Beginn der die Zeichenfolge
  • (?!.*foo) - ein negatives Aussehen andernfalls das Spiel voraus, wenn es foo irgendwo auf der Linie
  • .*$ (oder String, wenn DOTALL Modus eingeschaltet ist) - alle 0+ Zeichen (aber ein Newline wenn DOTALL Modus ausgeschaltet ist) bis zum Ende der Zeichenkette/Zeile.

Was zu verwenden?

Tempered gierigen Token ist in der Regel viel weniger effizient. Verwenden Sie den Lookahead, der am Anfang verankert ist, wenn Sie nur überprüfen müssen, ob eine Zeichenfolge etwas enthält oder nicht. In einigen Fällen kann jedoch das temperierte gierige Token erforderlich sein. Siehe When to Use this Technique.

+1

Danke für die zusätzlichen Informationen über temperierte gierige Token - ich wusste nicht, dass ich das gemacht habe. – singularity

+2

Eigentlich bin ich eher enttäuscht darüber, dass der berühmte [Regular expression to match line, der kein Wort enthält?] (Http://stackoverflow.com/questions/406230/regular-expression-to-match-line Die beste Antwort verweilt auf diesem temperierten gierigen Token. Es ist nicht die beste Lösung für diese Aufgabe. Der Engpass ist der nicht verankerte Lookahead, der an * jedem Ort * in der Zeichenkette ausgeführt wird, während in meiner Antwort der Lookahead gleich beim Start ausgelöst wird und nur einmal ausgeführt wird. Und es ist genug zu sehen, ob eine Zeichenfolge das Wort hat oder nicht. –

+0

Schöne ref! Das ist die Antwort, die mich verwirrt hat! – singularity