[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