Laden...

Regex: Quantifizierer in Lookarounds immer lazy?

Erstellt von darefilz vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.982 Views
D
darefilz Themenstarter:in
123 Beiträge seit 2004
vor 13 Jahren
Regex: Quantifizierer in Lookarounds immer lazy?

Guten Abend,

ich bin gerade auf eine interessante Sache gestoßen, bei der ich den Fehler nicht bei mir finden kann (was nicht heißt, dass es nicht mein Fehler ist): und zwar verhalten sich alle Quantifizierer in allen Lookarounds lazy.
Beispiel: der reguläre Ausdruck ".{0,30}a" verhält sich wie angegeben greedy (und trifft (nach den anderen Zeichen) das letzte 'a' im Bereich von 30 Zeichen), aber der Ausdruck "(?≤.{0,30})a" trifft das erste 'a' und verhält sich somit lazy (obwohl kein ? angegeben ist).

Ich habe das mit allen anderen Lookarounds und allen anderen Quantifizierern getestet und sie verhalten sich ebenso faul, wie der im Beispiel.
Soll das so?
Ich habe kräftig gegoogelt und bei Microsoft selbst nachgelesen, aber nirgends ist dieser Sachverhalt beschrieben.

Freue mich über jeden Beitrag.
Danke, df

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo darefilz,

aber der Ausdruck "(?≤.{0,30})a" trifft das erste 'a' ...

ich würde mich wundern, wenn es anders wäre. Ich kann darin auch keinen Fehler erkennen. Der Punkt ist doch, dass bei (?≤.{0,30})a der Pattern a gefunden werden soll, aber das nur an den Stellen, an denen eine zusätzliche Bedingung (der Lookbehind) erfüllt ist. Das bedeutet, dass zuerst nach a gesucht wird und danach die zusätzliche Bedingung (?≤.{0,30}) geprüft wird. Natürlich wird zuerst die erste Stelle überprüft, an der a gefunden wird. Und wenn da die Bedingung erfüllt ist (und das ist sie ja immer, denn es stehen immer mindestens 0 Zeichen vor dem a), wird der Treffer gemeldet. Diesen Lookbehind kann man sich also sparen.

... und verhält sich somit lazy

Nö, die Lookarounds sind trotzdem greedy wie du mit dem Pattern (?≤(.{0,30}))a in On-the-fly Regex-Tester: Regex-Lab leicht nachvollziehen kannst. Wenn der Quantifizierer im Lookaround lazy wäre, wäre die erste Gruppe immer null Zeichen lang. Aber sie ist solang wie es geht (also bis zu 30 Zeichen vor dem gerade gefundenen a, aber natürlich nicht darüberhinaus, denn ein Lookbehind muss ja per Definition vor dieser Stelle matchen, um erfüllt zu sein).

herbivore

D
darefilz Themenstarter:in
123 Beiträge seit 2004
vor 13 Jahren

Hallo herbivore,

danke für die Antwort.

Das bedeutet, dass zuerst nach a gesucht wird und danach die zusätzliche Bedingung (?≤.{0,30}) geprüft wird. Das macht Sinn, stimmt. Und dann hat das Ganze auch schon nichts mehr mit lazy oder greedy zu tun. Alles klar, danke.

darefilz