Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   RegEx Frage (https://www.delphipraxis.net/187946-regex-frage.html)

hansklok 18. Jan 2016 17:28

RegEx Frage
 
Hallo,

Ich möchte folgende Textzeile:
Code:
0 @Reference@ Objekt
mittels RegEx parsen.

Dazu verwende ich folgendes Pattern:
Code:
^(0|[1-9]+[0-9]*) (@[^@]+@ |)([A-Za-z0-9_]+)( [^\n\r]*|)$
Das funktioniert auch Tip Top, nur würde ich gern beim zweiten Match "(@[^@]+@ |)", dass nur der Inhalt zwischen den @-Zeichen gematcht wird. Inwiefern muss ich das Pattern abändern?

Herzliche Grüße

himitsu 18. Jan 2016 17:51

AW: RegEx Frage
 
Noch paar Klammern
SQL-Code:
 (@([^@]+)@ |)
/
SQL-Code:
 @([^@]+)@ |
, (Klammern um das, was man haben will :roll:)
oder ein paar Look-Around

http://www.regular-expressions.info/lookaround.html

hansklok 18. Jan 2016 17:59

AW: RegEx Frage
 
Zitat:

Zitat von himitsu (Beitrag 1327380)
Noch paar Klammern
SQL-Code:
 (@([^@]+)@ |)
/
SQL-Code:
 @([^@]+)@ |
, (Klammern um das, was man haben will :roll:)
oder ein paar Look-Around

http://www.regular-expressions.info/lookaround.html

Danke himitsu.

Ich vergas zu erwähnen, dass der von @ eingeschlossene Wert optional ist! Deswegen wird das nichts, indem ich das @ einfach vor und hinter die Klammer setze.

Dalai 18. Jan 2016 18:15

AW: RegEx Frage
 
Zitat:

Zitat von hansklok (Beitrag 1327381)
Ich vergas zu erwähnen, dass der von @ eingeschlossene Wert optional ist! Deswegen wird das nichts, indem ich das @ einfach vor und hinter die Klammer setze.

Dann mach die innere Klammer mittels eines Fragezeichens optional:
Code:
(@([^@]+)?@ |)
(oder sowas in der Art).

MfG Dalai

SProske 18. Jan 2016 18:51

AW: RegEx Frage
 
Einmal wüst gebastelt:

Code:
^(0|[1-9][\d]*) (?:@?((?<=@)[^@]+(?=@)|)(?:@ )?)([\w]+)( [^\n\r]*|)$
Im Prinzip außenrum eine non-Capturing group für die @s, innen drin ein Look-Ahead/Look-Behind

Code:
^(0|[1-9][\d]*) (?:@?((?<=@)[^@]+(?=@)|(?!@))(?:@ )?)([\w]+)( [^\n\r]*|)$
verhindert dann auch noch
Code:
0 @@ Objekt
Durch das
Code:
[^\n\r]*
wird übrigens auch

Code:
0 Referenz Objekt
gematcht.

hansklok 18. Jan 2016 19:34

AW: RegEx Frage
 
Code:
^(0|[1-9][\d]*) (?:@?((?<=@)[^@]+(?=@)|(?!@))(?:@ )?)([\w]+)( [^\n\r]*|)$
@SProske: Prima, das macht genau das, was es soll. Vielen lieben Dank Dir und den anderen Beitragenden dafür ;)

hansklok 4. Feb 2016 01:29

AW: RegEx Frage
 
Hallo,

Eine kleine Frage als Nachtrag: wie muss ich das Pattern abändern, sodass Objekt nach einer Fallentscheidung geparst wird? Wenn Objekt von @-Zeichen umgeben wird, soll es nur den Inhalt, also ohne @-Zeichen Matchen, ansonsten immer den kompletten Inhalt.

Beste Grüße

SProske 4. Feb 2016 18:09

AW: RegEx Frage
 
Könntest du dafür mal ein Beispiel geben, wie der String aussehen sollte und was du in welcher Gruppe matchen willst?

hansklok 4. Feb 2016 19:16

AW: RegEx Frage
 
Zitat:

Zitat von SProske (Beitrag 1329442)
Könntest du dafür mal ein Beispiel geben, wie der String aussehen sollte und was du in welcher Gruppe matchen willst?

Klara, gern ;)
Also mein bisheriges patter schaut so aus:
Code:
(0|[1-9][\d]*) (?:@?((?<=@)[^@]+(?=@)|(?!@))(?:@ )?)([A-Za-z0-9_]+)( [^\n\r]*|)
Beispiele für ein Match sind:
Zitat:

1 NAME Max /Mustermann/
2 DATE 22 APR 2016
Dabei werden "Max /Mustermann/" und "22 APR 2016" durch das Teilpattern
Zitat:

( [^\n\r]*|)
gematcht. Nun gibt es aber Signalwörter wie "FAMS, CHIL oder FAMC" und wenn diese im Teilpattern
Zitat:

([A-Za-z0-9_]+)
auftauchen, dann soll das letzte Pattern nur den Inhalt der @-Zeichen parsen.
Beispiel:
Zitat:

1 FAMC @I123@ // also I123
1 FAMS @I124@ // also I124
1 CHIL @I125@ // also I125

SProske 4. Feb 2016 20:02

AW: RegEx Frage
 
Hast du Möglichkeit, das ganze nachzubearbeiten?

Also einfach die @s wegzudoktorn, wenn in der Gruppe davor eines der Signalwörter auftritt? Das sollte wesentlich einfacher gehen, als das Regex so anzupassen, dass die Signalwörter berücksichtigt werden und dann eine Fallunterscheidung zu machen.

Was sollte denn passieren bei:

Code:
1 NAME @Max /Mustermann/@
1 FAMC I123
1 FAMC @I123
1 FAMC I123@
1 FAMC @I@12@3@


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:41 Uhr.
Seite 1 von 2  1 2      

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