Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   RegEx für zwei Zeichen (https://www.delphipraxis.net/147551-regex-fuer-zwei-zeichen.html)

freak4fun 11. Feb 2010 01:57


RegEx für zwei Zeichen
 
Hallo,
ich hab heute erst angefangen mit RegEx und gleich ein Problem.
Ich habe eine Zeile die so ausieht:
Code:
2181 Statistik MP WS 2009 3,7 5.0 BE 02.02.2010 1
Diese habe ich nun in einer StringList. An der Stelle wo das MP steht kann auch SP, PL oder VL stehen.
Ich möchte nun prüfen ob an einer Stelle in der Stringlist (list) SP, PL, MP oder VL steht.
So habe ich es versucht:
Delphi-Quellcode:
i := 0;
repeat
  Inc(i);
  ShowMessage(IntToStr(i) + '  ' + list[i] + '  ' + BoolToStr(ExecRegExpr('[\(MP\)|\(VL\)|\(PL\)]', list[i]), true));
until ExecRegExpr('[\(MP\)|\(VL\)|\(PL\)]', list[i]) or (i = list.Count);
Aber auch wenn da Mj statt MP steht wird es True. :(

Wo ist mein Fehler?

Panthrax 11. Feb 2010 03:08

Re: RegEx für zwei Zeichen
 
Hm. Schon lang nicht mehr gemacht, aber müsste das nicht einfach so etwas sein?:

(MP|VL|PL)

Frei nach dem Schema: (Alternative1 | Alternative2 | ... | AlternativeN)

In eckigen Klammern werden Zeichenmengen notiert; z.B. beliebig viele Buchstaben: [A-Za-z]*

himitsu 11. Feb 2010 06:27

Re: RegEx für zwei Zeichen
 
Ich würde noch die Leerzeichen mit einbeziehen,
Delphi-Quellcode:
'( MP | VL | PL )'
// oder
' (MP|VL|PL) '
denn wenn bei "Statistik" auch mal was Anderes steht, welches eine dieser Zeichenfolgen enthält, dann gäbe es Probleme.

Es gibt auch verschiedene Wege, um Wortgrenzen zu entdecken.
eventuell so
Delphi-Quellcode:
'[^A-Za-z](MP|VL|PL)[^A-Za-z]'

s-off 11. Feb 2010 06:36

Re: RegEx für zwei Zeichen
 
Zitat:

Zitat von himitsu
Es gibt auch verschiedene Wege, um Wortgrenzen zu entdecken.
eventuell so
Delphi-Quellcode:
'[^A-Za-z](MP|VL|PL)[^A-Za-z]'

Damit findest Du aber keine Wortgrenzen; Blanks und Zahlen werden hier bspw. mitgefressen.

So findet man Wortgrenzen in perlkompatiblen Dialekten.
Code:
\b(MP|VL|PL)\b

himitsu 11. Feb 2010 07:05

Re: RegEx für zwei Zeichen
 
Zitat:

Zitat von s-off
Damit findest Du aber keine Wortgrenzen; Blanks und Zahlen werden hier bspw. mitgefressen.

Nja, bin auch noch nicht so versiert mit dieser rießigen Syntax. :oops:

Blanks waren geplant, also vorallem die Leerzeichen :stupid:
und Zahlen und anderes hab ich einfach mal ignoriert ... sieht, anhand des Beispiels, nicht so aus, als wenn man dieses beachten muß.
Auch wenn deines da schon besser ist, hätte meines zumindestens irgendwie funktioniert. :roll:

freak4fun 11. Feb 2010 09:12

Re: RegEx für zwei Zeichen
 
Zitat:

Zitat von himitsu
Delphi-Quellcode:
'( MP | VL | PL )'
// oder
' (MP|VL|PL) '

Das geht! :shock: Ich hab mich durch die eckigen Klammern blenden lassen. Dadurch wurd von SP das S in Statistik gefunden. Ich wusste nicht das die Alternativen auch ohne [] gehen. Anfängerfehler! Danke euch! :thumb:

himitsu 11. Feb 2010 09:17

Re: RegEx für zwei Zeichen
 
Klar geht das ... [] steht nur für EIN "zeichen", wobei man hier praktisch mehrere Zeichen hat.

[a..z] steht sozusagen für (a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y |z)
es ist also praktisch gesehn nur eine Vereinfachung der Alternativen.

wobei theoretisch auch ' MP | VL | PL ' gehen müßte oder '\b(MP|(V|P)L)\b' :lol:

freak4fun 11. Feb 2010 09:21

Re: RegEx für zwei Zeichen
 
Zitat:

Zitat von himitsu
Klar geht das ... [] steht nur für EIN "zeichen", wobei man hier praktisch mehrere Zeichen hat.

[a..z] steht sozusagen für (a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y |z)
es ist also praktisch gesehn nur eine Vereinfachung der Alternativen.

Genau, hatte ich auch zwischenzeitlich: [S|M|V|P]{1}[P|L]{1} aber das ging auch irgendwie nicht. :gruebel:
Zitat:

Zitat von himitsu
wobei theoretisch auch ' MP | VL | PL ' gehen müßte

Geht auch! :angel:

himitsu 11. Feb 2010 09:25

Re: RegEx für zwei Zeichen
 
'\b(MP|(V|P)L)\b' = MP VL oder PL

'\b((S|M|V|P)(P|L))\b' = SP MP VP PP SL ML VL oder PL

die {1} kannst du weglassen, da dieses praktisch der Standard ist

Dieses [...] entspricht einem SET OF CHAR (in Delphi) und (...) ist eine Gruppierung.

PS: ( | und ) sind innerhalb eines SETS nur ganz normale Zeichen.

' [|] ' entspricht also ' \| '

freak4fun 11. Feb 2010 09:40

Re: RegEx für zwei Zeichen
 
Zitat:

Zitat von himitsu
'\b(MP|(V|P)L)\b' = MP VL oder PL

'\b((S|M|V|P)(P|L))\b' = SP MP VP PP SL ML VL oder PL

die {1} kannst du weglassen, da dieses praktisch der Standard ist

Dieses [...] entspricht einem SET OF CHAR (in Delphi) und (...) ist eine Gruppierung.

PS: ( | und ) sind innerhalb eines SETS nur ganz normale Zeichen.

' [|] ' entspricht also ' \| '

Ja, doch! :snowball: http://fnse.de/S01/17P.gif


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:41 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