Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   RegEx, Probleme mit Suchstring (https://www.delphipraxis.net/180137-regex-probleme-mit-suchstring.html)

Gutelo 25. Apr 2014 03:27

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:
RegExStr := 'ABC.*(\d*).*XYZ';
RegEx := TRegEx.Create(RegExStr,[roSingleLine,roIgnoreCase]);
MatchZ := RegEx.Matches(RichEdit1.text);
RichEdit1.text enthaelt den String 'ABC irgendwas 3 something XYZ'

Gutelo 25. Apr 2014 05:26

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

Dejan Vu 25. Apr 2014 07:18

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: http://regex101.com

Da versteht man gleich, was das ? bedeutet.

Gutelo 25. Apr 2014 09:02

AW: RegEx, Probleme mit Suchstring
 
Hallo Dejan

Zitat:

Du willst ja keine Ziffern, also kannst Du auch nach 'ABC[^0-9]*(\d*).*XYZ' suchen
Leider nicht so einfach. Ich durchsuche eine HTML Seite und da sind noch Haufenweise Sonderzeichen drin.

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.

himitsu 25. Apr 2014 12:01

AW: RegEx, Probleme mit Suchstring
 
Ja, aber in einem Set, gibt es als erstes Zeichen eine Negierung an.

Dejan Vu 25. Apr 2014 13:05

AW: RegEx, Probleme mit Suchstring
 
Zitat:

Zitat von Gutelo (Beitrag 1256897)
Mit deiner Theorie zum greedy Algorithmus hast du wahrscheinlich Recht.

Keine Ahnung, das hat mir regex101.com gesagt. Wirklich eine super Site für RegEx-Noobs wie mich. Da lernt man sehr schnell, wie das funktioniert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:24 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz