RegEx

29/04/2009 - 00:05 von A. Sicken | Report spam
Hallo,

ich suche zum Auswerten einer Konfiguration nach einem regulàren Ausdruck
(oder nach einer besseren Strategie), welche mit folgendem Problem fertig
werden soll:

a) Suche Zeichenfolgen der Form '%{VAR_NAME}' (ohne Anführungszeichen) und
b) ignoriere folgendes '\%{VAR_NAME}' aber
c) beachte dieses '\\%{VAR_NAME}'

%{VAR_NAME} soll durch den Inhalt einer Variable VAR_NAME ersetzt werden,
wenn es sich nach den gàngigen Regeln des Quoting um einen alleinstehenden
Ausdruck handelt.

Die bisherige Lösung:

SKRIPT-ANFANG==# In diesem Beispiel soll _nicht_ %{ab} und nur %{le} gefunden
# bzw. ersetzt werden. ACHTUNG: "\\" wird reduziert zu '\'...
my $data = "Ein beliebiger\tText mi\t Vari\\%{ab}b%{le}n.";

# Vorgàngerteilstück zum Prüfen der evtl. abschließenden '\'.
# Eine ungerade Anzahl bedeutet aktives quoting...
my $first;

# Teilstücke mit den zu ersetzenden %{var}...
my @parts = split /(?=%\{[a-z]+\})/i, $data;
my $var_name;

# Die Schleife braucht in jedem Fall ein Element, welches als
# Vorgànger geprüft werden kann...
unshift @parts, '';

while (@parts > 0) {
$first = shift @parts;
if (defined $parts[0]) {
# Falls das Teilstück nicht mit einer
# Variable beginnt, zum nàchsten Listen-
# element gehen...
next unless
$parts[0] =~ m/%\{([a-z]+)\}/i;

# Variablennamen merken
$var_name = $1;

# Falls das Vorgàngerelement mit '\' endet
# und deren Anzahl ungerade ist, zum
# nàchsten Listenelement gehen.
next if
($first =~ m/(\\+)$/) &&
(length($1)%2) == 1;

print "Ersetze '$var_name'.";
}#end_if
}#end_while
SKRIPT-ENDE==
Ideal wàre ein Regex, der nur nicht-gequotete %{var} finden würde.

Kennt jemand vielleicht eine Lösung oder weiß, wo man diese finden kann?
Besten Dank im Voraus

A. Sicken
 

Lesen sie die antworten

#1 Moritz Lenz
29/04/2009 - 01:03 | Warnen spam
A. Sicken wrote:
Hallo,

ich suche zum Auswerten einer Konfiguration nach einem regulàren Ausdruck
(oder nach einer besseren Strategie), welche mit folgendem Problem fertig
werden soll:

a) Suche Zeichenfolgen der Form '%{VAR_NAME}' (ohne Anführungszeichen) und
b) ignoriere folgendes '\%{VAR_NAME}' aber
c) beachte dieses '\\%{VAR_NAME}'



ungetestet:

my $regex = qr{
[^\%]* # "normaler" text
(?:
(?> # backtracke nicht darein
\\ . # entweder ein backlash, der ein zeichen escaped
| %{\w+} # oder ein Variablenname
| % # falls du ein einfaches Prozent auch erlauben willst
)
[^\%]* # wieder normaler Text
}xs;

Ideal wàre ein Regex, der nur nicht-gequotete %{var} finden würde.

Kennt jemand vielleicht eine Lösung oder weiß, wo man diese finden kann?
Besten Dank im Voraus



Jeffrey E. Friedl, "Mastering Regular Expressions" (gibts auch auf Deutsch).

Grüße,
Moritz

Moritz Lenz
http://perl-6.de/ http://moritz.faui2k3.org/

Ähnliche fragen