![]() |
[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... |
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: ![]() Ich hab gerade mal ein bisschen rumprobiert und das ist dabei rausgekommen:
Code:
Da kommt dann das bei PHP raus:
preg_match_all('/(?:([0-9])*?(:|#)?)*/', '1:2#3', $array);
Code:
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...).
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] => ) ) Ich hoffe, das hilft dir weiter. :dp: |
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 ;) |
Re: [PCRE] Separatoren als Subexpressions
Zitat:
Code:
preg_match_all('/(?:([^:#])*?(:|#)?)*/', '1:2#3', $array);
|
Re: [PCRE] Separatoren als Subexpressions
Hi,
also unter Delphi mit der PCRE.dll kommt bei dem
Code:
das hier raus (die showmessage ist von mir zusammengebaut):
(.+?)(#|:){0,1} // im greedy-modus!
Code:
mfG
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] = '' mirage228 |
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 :?
|
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 |
Re: [PCRE] Separatoren als Subexpressions
Na ja...
Code:
Ich glaub ich bastel doch lieber selbst einen Tokenizer :(
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 |
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:
Das sollte besser sein :)
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] = '' mfG mirage228 |
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 10:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz