![]() |
RegEx, Probleme mit Suchstring
RegEx macht wieder mal nicht was ich moechte
Wieso findet RegExStr = 'ABC.*(\d*).*XYZ' die Zahl 3 im String 'ABC irgendwas 3 something XYZ' nicht? So wie ich das verstehe sollte .* fuer eine beliebige Anzahl Zeichen stehen, also alles zwischen ABC und 3, bzw zwischen 3 und XYZ zulassen. Der Ausdruck (\d*) muesste bewirken, dass eine gefundene Zahl am Ende in Item[0].Groups[1].Value landet, also in der ersten Gruppe (Gruppe durch die runden Klammern festgelegt). Der Ausdruck \d* muesste fuer eine beliebig lange Kette von Zahlen stehen, so dass jede beliebige Zahl anstatt der 3 im String zurueckgegeben werden sollte. Aus irgendwelchen Gruenden ist Match.Count aber 0; Der Kern der Implementation sieht folgendermassen aus:
Delphi-Quellcode:
RichEdit1.text enthaelt den String 'ABC irgendwas 3 something XYZ'
RegExStr := 'ABC.*(\d*).*XYZ';
RegEx := TRegEx.Create(RegExStr,[roSingleLine,roIgnoreCase]); MatchZ := RegEx.Matches(RichEdit1.text); |
AW: RegEx, Probleme mit Suchstring
Anscheinend macht
RegExStr = 'ABC.*?(\d+).*?XYZ' was ich moechte. Kann mir jemand erklaeren warum man '\d+' verwenden muss und nicht '\d*' ? Meiner Meinung nach sollte es egal sein wenn eine einstellige Zahl vorhanden ist, denn laut Delphi Hilfe ist: 1) Ein Sternchen nach einem Zeichen oder einer Zeichengruppe steht für eine beliebige Anzahl von Vorkommen dieses Zeichens oder dieser Zeichengruppe, einschließlich keinem Vorkommen. bo?t entspricht zum Beispiel bt, bot und boot. 2) Ein Plus-Zeichen nach einem Zeichen oder einer Zeichengruppe steht für eine beliebige Anzahl von Vorkommen dieses Zeichens oder dieser Zeichengruppe mit mindestens einem Vorkommen. bo+t entspricht zum Beispiel bot und boot, aber nicht bt. Version 2 macht natuerlich mehr Sinn, aber ich sehe keinen Grund dafuer dass \d* nicht funktionieren sollte. Noch schwerer zu verstehen ist die Kombi '.*?' Die ersten beiden Zeichen '.*' stehen fuer eine beliebige Menge willkuerlicher Character. Wieso ist das Fragezeichen notwendig? Stern erlaubt das davorstehehnde in beliebiger Anzahl, das Fragezeichen erlaubt nur kein oder einmaliges Vorkommen des davorstehenden Teils, also hat gegenteilige Wirkung |
AW: RegEx, Probleme mit Suchstring
Lustig, wenn man das in den diversen online Regex Testern probiert, bekommt man alle möglichen Ergebnisse. RegEx ist implementierungsabhängig (na toll).
Ich glaube, RegEx sucht immer dem längsten Match. und der ist bei 'ABC.*' eben alles bis zum XYZ. Du willst ja keine Ziffern, also kannst Du auch nach 'ABC[^0-9]*(\d*).*XYZ' suchen. Das sollte dann auch funktionieren. Das '?' könnte diesem Bestreben (suche längsten Match) einen Strich durch die Rechnung machen (lazy vs. greedy search). Allerdings würde ich das von mir vorgeschlagene Pattern verwenden, weil es eindeutiger beschreibt, was Du willst. Wer weiss, wenn Emba irgendwann meint, das ihr Regex(ist das von denen?) nicht kompatibel zu anderen ist, schreiben die das vielleicht sogar mal richtig/anders und dann hilft dir dein Workaround vielleicht auch nicht mehr. Mein Favorit: ![]() Da versteht man gleich, was das ? bedeutet. |
AW: RegEx, Probleme mit Suchstring
Hallo Dejan
Zitat:
Die Kombination .*? ist von den Regeln her Quatsch. Mit deiner Theorie zum greedy Algorithmus hast du wahrscheinlich Recht. '.*XYZ' geht uebrigends auch nicht, da muss auch .*? stehen. Bist du dir mit ^ vor 0-9 sicher? Das Dach markiert eigentlich den Anfang einer Zeile. |
AW: RegEx, Probleme mit Suchstring
Ja, aber in einem Set, gibt es als erstes Zeichen eine Negierung an.
|
AW: RegEx, Probleme mit Suchstring
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz