[Bielefeld-pm] (kein Betreff)
c.duehl at gmx.de
c.duehl at gmx.de
Mi Jul 29 00:41:06 PDT 2009
Guten Morgen,
ich hab versucht, Nils RE-Problem irgendwie nachzubauen, um eine Lösung zu basteln.
Neben der mit den Doppelten REs (fangend / nicht fangend) von gestern, gäbe es noch die Möglichkeit, sich Stückchenweise vorzuarbeiten, oder aber den bisherigen Ausdruck zu nutzen und einen zweiten Test nachzulagern.
So nach dem Motto
if (my @treffer = m~schwierige RE~) {
my $n = @treffer;
if ($treffer[$n-1] eq $treffer[$n-3]) {
# eigentliche Behandlung hier
}
}
Ich komme allerdings gar nicht so weit. Vermutlich ist mein Beispiel nicht komplex genug. Ich poste es trotzdem mal:
[code]
#!/usr/bin/perl
use strict;
use warnings;
my $re_param =
qr~[\w]+
\s*
=
\s*
['"]?
[^'"<>]+
['"]?
\s*
~x;
while (<DATA>) {
chomp;
print "zeile $.: $_\n";
my @werte =
m~<
(ELEMENT|A)
(?:
\s+
((?:$re_param\s*)+)
)?
>
(
(?:
(?!</\1>).
)*
)
</\1>
~gx;
for my $w (@werte) {
print " ", (defined $w ? $w : '---'), "\n";
}
}
__DATA__
erste zeile <ELEMENT var1='wert1' var2="wert2">Inhalt</ELEMENT> mitte <A var3='wert3'><i>bla</i></A> Rest
zweite zeile <ELEMENT var1='wert1' var2="wert2">Inhalt <i>irgendwelcher</i> Art</ELEMENT> Rest
dritte zeile <ELEMENT var1='wert1'>Inhalt irgendwelcher Art</ELEMENT> Rest
vierte zeile <ELEMENT var1=wert1>Inhalt irgendwelcher Art</ELEMENT> Rest
fuenfte zeile <ELEMENT>Inhalt irgendwelcher Art</ELEMENT> Rest
[/code]
Ergebnis:
[code]
zeile 1: erste zeile <ELEMENT var1='wert1' var2="wert2">Inhalt</ELEMENT> mitte <A var3='wert3'><i>bla</i></A> Rest
ELEMENT
var1='wert1' var2="wert2"
Inhalt
A
var3='wert3'
<i>bla</i>
zeile 2: zweite zeile <ELEMENT var1='wert1' var2="wert2">Inhalt <i>irgendwelcher</i> Art</ELEMENT> Rest
ELEMENT
var1='wert1' var2="wert2"
Inhalt <i>irgendwelcher</i> Art
zeile 3: dritte zeile <ELEMENT var1='wert1'>Inhalt irgendwelcher Art</ELEMENT> Rest
ELEMENT
var1='wert1'
Inhalt irgendwelcher Art
zeile 4: vierte zeile <ELEMENT var1=wert1>Inhalt irgendwelcher Art</ELEMENT> Rest
ELEMENT
var1=wert1
Inhalt irgendwelcher Art
zeile 5: fuenfte zeile <ELEMENT>Inhalt irgendwelcher Art</ELEMENT> Rest
ELEMENT
---
Inhalt irgendwelcher Art
[/code]
Gruß Christian
Mehr Informationen über die Mailingliste Bielefeld-pm