Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [PCRE] Separatoren als Subexpressions (https://www.delphipraxis.net/55415-%5Bpcre%5D-separatoren-als-subexpressions.html)

Dax 20. Okt 2005 15:08


[PCRE] Separatoren als Subexpressions
 
Hi ihr :)

Ich hab ein kleines PCRE-Problem, wie man aus dem Titel sehen dürfte...

Stellt euch die folgende Situation vor:

Ich habe den string '1:2#3' (nur als Beispiel), den ich mit dem Ausdruck (:|#)* zerlege. Als Ergebnis kriege ich '1' '2' '3', hätte aber gerne '1' ':' '2' '#' '3'. Ich weiß es klingt komisch, aber wenn ich schon eine nette RegExp-Libary hier hab will ich für meinen nächsten Parser nicht unbedingt schon wieder einen eigenen Tokenizer-Teil schreiben, sondern nach Möglichkeit die PCRE benutzen.

read you,
Dax

Sollte ich mal wieder was total einfaches übersehen haben, haut mich einfach...

S2B 20. Okt 2005 15:54

Re: [PCRE] Separatoren als Subexpressions
 
Hi Dax,
wenn du einen String mit einer Regex-Split-Funktion teilst, dann ist es klar, dass die Trennzeichen nicht mit zurückgeliefert werden. :cyclops:

Ich hab jetzt zwar keine Erfahrungen mit RegEx-Klassen aus anderen Sprachen, in PHP gibt es jedoch eine Funktion, die da Abhilfe schaffen könnte: preg_match_all().

Ich hab gerade mal ein bisschen rumprobiert und das ist dabei rausgekommen:
Code:
preg_match_all('/(?:([0-9])*?(:|#)?)*/', '1:2#3', $array);
Da kommt dann das bei PHP raus:
Code:
Array
(
    [0] => Array
        (
            [0] =>
            [1] => 1:
            [2] =>
            [3] => 2#
            [4] =>
            [5] => 3
            [6] =>
        )

    [1] => Array
        (
            [0] =>
            [1] => 1
            [2] =>
            [3] => 2
            [4] =>
            [5] => 3
            [6] =>
        )

    [2] => Array
        (
            [0] =>
            [1] => :
            [2] =>
            [3] => #
            [4] =>
            [5] =>
            [6] =>
        )

)
Das erste Unterarray ist zu vernachlässigen (siehe Manual), die anderen beiden enthalten genau die Werte, die du suchst. Ich bin sicher, dass andere Klassen das ein wenig praktischer ausgeben (wenn sie überhaupt solch eine Funktion kennen...).

Ich hoffe, das hilft dir weiter. :dp:

Dax 20. Okt 2005 15:57

Re: [PCRE] Separatoren als Subexpressions
 
Na ja, wirklich weiter hilft mir das nicht, denn später sollen zwischen den Separatoren nicht nur Zahlen stehen :?

Aber trotzdem danke, ich seh mal, ob man damit vielleicht doch was anstellen kann ;)

S2B 20. Okt 2005 15:58

Re: [PCRE] Separatoren als Subexpressions
 
Zitat:

Zitat von Dax
Na ja, wirklich weiter hilft mir das nicht, denn später sollen zwischen den Separatoren nicht nur Zahlen stehen :?

:gruebel:

Code:
preg_match_all('/(?:([^:#])*?(:|#)?)*/', '1:2#3', $array);

mirage228 20. Okt 2005 16:04

Re: [PCRE] Separatoren als Subexpressions
 
Hi,

also unter Delphi mit der PCRE.dll kommt bei dem
Code:
(.+?)(#|:){0,1} // im greedy-modus!
das hier raus (die showmessage ist von mir zusammengebaut):
Code:
3 matches made in submited text.
Matches for 1:2#3 : [1:]@0:2
Match[0] = '1:'
Match[1] = '1'
Match[2] = ':'

Matches for 1:2#3 : [2#]@2:2
Match[0] = '2#'
Match[1] = '2'
Match[2] = '#'

Matches for 1:2#3 : [3]@4:1
Match[0] = '3'
Match[1] = '3'
Match[2] = ''
mfG
mirage228

Dax 20. Okt 2005 16:18

Re: [PCRE] Separatoren als Subexpressions
 
Danke, so funktionierts endlich teilweise :) Wenn ich vor die 1 kein anderes Zeichen setze, kommt bei mir im ersten Match was anderes raus.. und bei mir sind Operatoren auch greedy :?

mirage228 20. Okt 2005 16:29

Re: [PCRE] Separatoren als Subexpressions
 
Also ich hab grade gemerkt, dass bei mehr als einer Zahl/Zeichen vor dem Seperator nicht richtig gemachted wird, weil der Operator ungreedy ist, und im greedy-Modus matched er zu viel.

Also könnte ich noch das anbieten:
Code:
((.*?)(\:|\#))|((.+)$)
mfG
mirage228

Dax 20. Okt 2005 16:33

Re: [PCRE] Separatoren als Subexpressions
 
Na ja...
Code:
Match[0]: 1:
Match[1]: 1:
Match[2]: 1

Match[0]: 2#
Match[1]: 2#
Match[2]: 2
Match[3]: #

Match[0]: 3
Match[1]:
Match[2]:
Match[3]:
Match[4]: 3
Match[5]: 3
Ich glaub ich bastel doch lieber selbst einen Tokenizer :(

mirage228 20. Okt 2005 16:38

Re: [PCRE] Separatoren als Subexpressions
 
Hi,

stimmt Du hast recht, die Matches sind immer an einer anderen Stelle, hatte ich nicht bedacht.

So, damit
Code:
((.+?)(\:|\#|$))
siehts so aus:
Code:
3 matches made in submitted text.
Matches for 1:2#3 : [1:]@0:2
Match[0] = '1:'
Match[1] = '1:'
Match[2] = '1'
Match[3] = ':'

Matches for 1:2#3 : [2#]@2:2
Match[0] = '2#'
Match[1] = '2#'
Match[2] = '2'
Match[3] = '#'

Matches for 1:2#3 : [3]@4:1
Match[0] = '3'
Match[1] = '3'
Match[2] = '3'
Match[3] = ''
Das sollte besser sein :)

mfG
mirage228

Dax 20. Okt 2005 16:45

Re: [PCRE] Separatoren als Subexpressions
 
Danke mirage :)

Mittlerweile hab ich aber selbst ein effektiveres gefunden, wie mir scheint *freu*
Code:
([^:#]+)|(:|#)
Deine Expression hat nämlich (wieder :() die Angewohnheit, die Separatoren einfach an Match[0] zu hängen und danach nie wieder anzukucken.
edit: Sorry, ich hab die Messageboxen immer falsch zusammengebastelt :wall: Es geht nämlich doch :duck:

Allen danke für die Hilfe :love:

But I'll be back :mrgreen:

Noch ein edit:

Endlich. Ich hab den Tokenizer den ich fürs Projekt brauche :love:
Code:
xor|or|and|not|_?[_\d\w]{0,}|\(|\)


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