Warum führt der RegEx-Ausdruck .*? nicht zum gewünschten Ergebnis?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Neu111
User
Beiträge: 69
Registriert: Dienstag 10. März 2020, 19:02

Hallo,
schaut euch bitte einmal folgenden regulären Ausdruck an:

https://pythex.org/?regex=((%5Cw%7B3%7D ... &verbose=0

Ich suche nach dem String
ABC/0-22/1111/10/AAAD-11/333/15/ZZZK
Die Buchstaben und Zahlen können variieren, und nach den ersten 4 Stellen sind bestimme Variationen möglich, z.B.

ABC/0 AK 22/1111/10/AAAD-11/333/15/ZZZK
DEF/9 ENZ UV 33/4444/55/DDDD-55/444/22/AAAA
ABC/0 TTL - VV 22/1111/10/AAAD-11/333/15/ZZZK

Der blaue Syntax bleibt immer gleich, der rote Syntax variiert.

Nun dachte ich, ich könne den roten Bereich mit dem RegEx .*? abdecken, weil das Fragezeichen bewirken soll "so wenig Zeichen wie möglich".

Doch in meinem Fall bewirkt .*? exakt das gleiche wie .*

Das hat zur Folge, dass in meinem Beispiel oben (siehe URL) als Ergebnis Match 1/1 nicht

ABC/0-22/1111/10/AAAD-11/333/15/ZZZK

gefunden wird

sondern der komplette String

111/0/KKK (10.100.20.100)|HH-1-1-A1|dfadsfasdf|ABC/0-22/1111/10/AAAD-11/333/15/ZZZK

Warum ist da so?
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Schau dir deinen regex mal bei regex101.com an. Da wird dir erklät, was was bewirkt.
3rd Capturing Group (.*?)
.
matches any character (except for line terminators)
*? matches the previous token between zero and unlimited times, as few times as possible, expanding as needed (lazy)
Dein String passt halt super auf die Expression. 3 Wordzeichen, ein Slash, zwischen einer und 8 Zahlen und dann beliebig viele Zahlen, bis es zwei Zahlen gefolgt von einem Slash gibt. Bingo.

Ansonsten scheint | ja eine besondere Bedeutung in deinen Daten zu haben. Wenn du das in der dritten Gruppe ausschließt (also wenn das wirklich nicht an der Stelle vorkommen kann, weil es z.B. Datensätze trennt) sollte das funktionieren.

Der Unterschied zwischen * und *? sollte dir klar werden, wenn du deinen Ausdruck auf folgenden String anwendest und entsprechend änderst:
111/0/KKK (10.100.20.100)|HH-1-1-A1|dfadsfasdf|ABC/0-22/1111/10/AAAD-11/333/15/ZZZK|ABC/0-22/1111/10/AAAD-11/333/15/ZZZK
Antworten