AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

RegEx, Probleme mit Suchstring

Ein Thema von Gutelo · begonnen am 25. Apr 2014 · letzter Beitrag vom 25. Apr 2014
Antwort Antwort
Gutelo

Registriert seit: 29. Sep 2013
152 Beiträge
 
#1

RegEx, Probleme mit Suchstring

  Alt 25. Apr 2014, 04:27
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'

Geändert von Gutelo (25. Apr 2014 um 05:29 Uhr)
  Mit Zitat antworten Zitat
Gutelo

Registriert seit: 29. Sep 2013
152 Beiträge
 
#2

AW: RegEx, Probleme mit Suchstring

  Alt 25. Apr 2014, 06:26
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
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#3

AW: RegEx, Probleme mit Suchstring

  Alt 25. Apr 2014, 08:18
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.
  Mit Zitat antworten Zitat
Gutelo

Registriert seit: 29. Sep 2013
152 Beiträge
 
#4

AW: RegEx, Probleme mit Suchstring

  Alt 25. Apr 2014, 10:02
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#5

AW: RegEx, Probleme mit Suchstring

  Alt 25. Apr 2014, 13:01
Ja, aber in einem Set, gibt es als erstes Zeichen eine Negierung an.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#6

AW: RegEx, Probleme mit Suchstring

  Alt 25. Apr 2014, 14:05
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:10 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