AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein [PCRE] Separatoren als Subexpressions

[PCRE] Separatoren als Subexpressions

Ein Thema von Dax · begonnen am 20. Okt 2005 · letzter Beitrag vom 20. Okt 2005
Antwort Antwort
Dax
(Gast)

n/a Beiträge
 
#1

[PCRE] Separatoren als Subexpressions

  Alt 20. Okt 2005, 15:08
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...
  Mit Zitat antworten Zitat
Benutzerbild von S2B
S2B

Registriert seit: 1. Feb 2004
Ort: Aachen
1.268 Beiträge
 
#2

Re: [PCRE] Separatoren als Subexpressions

  Alt 20. Okt 2005, 15:54
Hi Dax,
wenn du einen String mit einer Regex-Split-Funktion teilst, dann ist es klar, dass die Trennzeichen nicht mit zurückgeliefert werden.

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.
Simon Praetorius
Gruß
S2B
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#3

Re: [PCRE] Separatoren als Subexpressions

  Alt 20. Okt 2005, 15:57
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
  Mit Zitat antworten Zitat
Benutzerbild von S2B
S2B

Registriert seit: 1. Feb 2004
Ort: Aachen
1.268 Beiträge
 
#4

Re: [PCRE] Separatoren als Subexpressions

  Alt 20. Okt 2005, 15:58
Zitat von Dax:
Na ja, wirklich weiter hilft mir das nicht, denn später sollen zwischen den Separatoren nicht nur Zahlen stehen


Code:
preg_match_all('/(?:([^:#])*?(:|#)?)*/', '1:2#3', $array);
Simon Praetorius
Gruß
S2B
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#5

Re: [PCRE] Separatoren als Subexpressions

  Alt 20. Okt 2005, 16:04
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
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#6

Re: [PCRE] Separatoren als Subexpressions

  Alt 20. Okt 2005, 16:18
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
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#7

Re: [PCRE] Separatoren als Subexpressions

  Alt 20. Okt 2005, 16:29
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
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#8

Re: [PCRE] Separatoren als Subexpressions

  Alt 20. Okt 2005, 16:33
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
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#9

Re: [PCRE] Separatoren als Subexpressions

  Alt 20. Okt 2005, 16:38
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
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#10

Re: [PCRE] Separatoren als Subexpressions

  Alt 20. Okt 2005, 16:45
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 Es geht nämlich doch

Allen danke für die Hilfe

But I'll be back

Noch ein edit:

Endlich. Ich hab den Tokenizer den ich fürs Projekt brauche
Code:
xor|or|and|not|_?[_\d\w]{0,}|\(|\)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 05:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf