2015-07-17 8 views
7

Ich habe viel Verwirrung im regulären Ausdruck und ich versuche, sie zu lösen. Hier habe ich die folgende Zeichenfolge:Unterschied in der Übereinstimmung aufgrund der Position des negativen Lookahead?

{start}do or die{end}extended string 

Meine zwei verschiedene reguläre Ausdrücke, wo ich nur die Position des Punktes geändert:

(.(?!{end}))* //returns: {start}do or di 
             //^ See here 
((?!{end}).)* //returns: {start}do or die 
             //^ See here 

Warum wird die erste Regex isst die letzte „e“?

Und auch, wie sich diese negative Vorschau diese * quantifier nicht gierig machen? Ich meine, warum kann ich Charaktere jenseits von {end} nicht konsumieren?

Antwort

2

Mit Ihrem negativen Look-Ahead sagen Sie, dass es die Regex übereinstimmen, die in Ihrem Fall ist unmöglich: {end}. Und . erfasst alles außer neue Zeile.

So mit dem ersten regulären Ausdruck:

(.(?!{end}))* 

Er verläßt die e aus, denn: e{end} kann nicht wegen des negativen Look-Ahead entspricht. Während in der zweiten regex, wo Sie den Punkt auf der anderen Seite haben sie können bis: {end}d so die e in Ihrem zweiten Regex enthalten ist.

+0

danke! aber kannst du etwas genauer sein? Warum e {end} wird wegen negativem Lookahead nicht übereinstimmen.Sollte es nicht nur {end} sein? –

+0

@ AL-zami '.' ist selbst gierig, also wird es so viel wie möglich versuchen. Also: '{start} do or diey' wird nicht funktionieren, wegen der legitimen Lookahead, aber es ermüdet so viel wie möglich zu passen und das ist:' {start} do oder di' nur ohne das 'e', weil es passt nicht zum Lookahead. In Ihrem zweiten Fall ist es die gleiche, erwarten Sie einige Dinge getauscht, so wieder versucht, es so weit wie möglich zu entsprechen: '{start} Friss Vogel oder stirb {end} e' und hier wieder ist es nicht wegen des Look-Ahead arbeiten. Es wird also enden mit: '{start} do or diech ', wo der Lookahead nicht passt. (Die Behauptungen sind nie im Spiel) – Rizier123

+0

@ AL-zami Also wo sind wir jetzt mit dieser Frage? – Rizier123

1

i sowohl einen Arbeitsablauf für die Regex-Engine herausgefunden haben für die regex die Aufgabe, auf den Abschluss ...

Zunächst für (.(?!{end}))* der Ansatz für die Regex-Engine wie folgt ...

"{start}do or die{end}extended string" 
^ .(dot) matches "{" and {end} tries to match here but fails.So "{" included 
"{start}do or die{end}extended string" 
^ . (dot) matches "s" and {end} tries to match here but fails.So "s" included 

.... 
....so on... 
"{start}do or die{end}extended string" 
      ^(dot) matches "e" and {end} here matches "{end}" so "e" is excluded.. 
so the match we get is "{start}do or di" 

für die secodn regex ((?! {End}).) * ....

"{start}do or die{end}extended string" 
^ {end} regex tries to match here but fails to match.So dot consumes "{". 

"{start}do or die{end}extended string" 
^ {end} regex tries to match here but fails again.So dot consumes "s". 

.... 
..so on.. 
"{start}do or die{end}extended string" 
      ^ {end} regex tries to match here but fails.So dot consumes the "e" 
"{start}do or die{end}extended string" 
       ^ {end} regex tries to match here and succeed.So the whole regex fail here. 

So we ended up with a match which is "{start}do or die" 
+0

Genau, du hast es verstanden! Ich mag auch deine Art, es anzuzeigen. – Rizier123

+0

danke :)) .... –

Verwandte Themen