Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Regex: Quantifizierer in Lookarounds immer lazy?
darefilz
myCSharp.de - Member



Dabei seit:
Beiträge: 124

Themenstarter:

Regex: Quantifizierer in Lookarounds immer lazy?

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo darefilz,
Zitat
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.
Zitat
... 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
private Nachricht | Beiträge des Benutzers
darefilz
myCSharp.de - Member



Dabei seit:
Beiträge: 124

Themenstarter:

beantworten | zitieren | melden

Hallo herbivore,

danke für die Antwort.
Zitat
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
private Nachricht | Beiträge des Benutzers