Thread Frage zu Perlfaq6: "Can I use Perl regular expressions to match balanced text?" (7 answers)
Opened by Gast at 2009-10-14 09:36

sid burn
 2009-10-14 13:25
#126966 #126966
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Quote
der erste Versuch kommt bis "I have some <brackets in "
auch wenn es keine Treffer war, kommt "brackets in " in den ersten capture puffer
da es kein Treffer war geht es weiter zum "oder"
mit dem "(?1)" wird jetzt nach "brackets in " gesucht und gefunden


Hier einmal die Regex aufgesplittet und erklärt.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
m/
( # Speichere alles in $1
< # Suche nach einem Literalen "<"
(?: # Entweder...
[^<>]++ # Soviele nicht "<" und ">" wie möglich einfangen"...
| # oder...
(?1) # wenn man hier ist muss das nächste zeichen ein "<"
# oder ">" sein. Mit (?1) wird die Regex Engine angewiesen
# weiter bei der erste klammern "(" weiterzumachen.
# kurz gesagt immer wenn du auf "<" oder ">" stößt
# ruft sich die regex praktisch "rekursiv" immer wieder
# selber auf. Dadurch kann eine beliebige
# verschachtelungstiefe erreicht werden.
# Wenn die Regex bei der ersten Klammer weiter macht muss
# wieder ein "<" kommen, kommt das nicht vorher
# (wenn es ein ">" ist )
# dann fährt die regex nun an dieser stelle weiter
)*
> # und hier wird nun das ">" erkannt das von (&1) nicht
# erkannt wurde
)
/xg;


Das "++" sorgt dafür das keine Zeichen mehr freigegeben werden von der Regex. Daher es sorgt dafür das wenn keine gleiche anzahl von öffnenden "<" zu ">" vorhanden sind, die regex abbricht.

EDIT: Erklärung ausgebaut.
Last edited: 2009-10-14 13:33:06 +0200 (CEST)
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de

View full thread Frage zu Perlfaq6: "Can I use Perl regular expressions to match balanced text?"