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?
Warum führt der RegEx-Ausdruck .*? nicht zum gewünschten Ergebnis?
Schau dir deinen regex mal bei regex101.com an. Da wird dir erklät, was was bewirkt.
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
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.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)
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