Problem mit regulären Ausdrücken
Problem mit regulären Ausdrücken
am 25.04.2006 16:35:35 von Anton Berg
Hallo,
ich habe ein kleines Problem mit regulären Ausdrücken, und zwar
betrachte ich Strings, die in etwa wie fogt aufgebaut sind:
eee=3D"test6" fff=3D"test7 8 9"/>
Ich will nun das
dem Gleichzeichen) und Wert (jeweils in Anführungszeichen) extrahieren
und in einem Hash speichern. Hierbei dient jeweils der Wert vor dem
Gleichzeichen als Key und die Daten in Anführungszeichen als
zugehöriger Wert.
In dem oben beschriebenen Beispiel folgt also eine Hashliste:
(aaa,test1)
(bbb,test2)
(ccc,test3)
(ddd,test4 test5)
(eee,test6)
(fff,test7 8 9)
Kann ich sowas mit Hilfe eines regulären Ausdrucks abfragen oder gibt
es einen einfacheren Weg (z.B. Zeichenweise)?
Ich hatte es ursprünglich wie folgt gelöst, hatte dabei aber den Fall
mit den Leerzeichen in Anführungszeichen vergessen...
$line_file1 =3D~ //) {
my @line_elements_file1 =3D split(/ /, $1);
Wie gesagt funktioniert es so nicht, da ja auch Leerzeichen im
Anführungszeichen gesetzten Wort auftreten können.
Grüsse und danke,
Anton
Re: Problem mit regulären Ausdrücken
am 25.04.2006 17:01:52 von Ingo Menger
Anton Berg schrieb:
> Hallo,
>
> ich habe ein kleines Problem mit regulären Ausdrücken, und zwar
> betrachte ich Strings, die in etwa wie fogt aufgebaut sind:
>
> eee=3D"test6" fff=3D"test7 8 9"/>
>
> Ich will nun das
> dem Gleichzeichen) und Wert (jeweils in Anführungszeichen) extrahieren
> und in einem Hash speichern. Hierbei dient jeweils der Wert vor dem
> Gleichzeichen als Key und die Daten in Anführungszeichen als
> zugehöriger Wert.
> Kann ich sowas mit Hilfe eines regulären Ausdrucks abfragen oder gibt
> es einen einfacheren Weg (z.B. Zeichenweise)?
Für heute empfehle ich die "oder"-Lösung, weil elegant und sicher
auch performant. Die Idee ist, den XML-String in einen String zu
verwandeln, der als Hashliteral evaluiert werden kann, also sowas wie
(a=3D>"v1", b=3D>"v2", ...)
my $x =3D '
est5"
> eee=3D"test6" fff=3D"test7 8 9"/>'
$x =3D~ s/
$x =3D~ s{/>}{)};
$x =3D~ s/(\w+)=3D"/,\1=3D>"/g;
$x =3D~ s/,//; # (aaa=3D>"test1" ,bbb=3D>"test2" ....)
%x =3D eval $x;
(Ungetestet.)
Funktioniert allerdings nur, wenn die Werte selbst keine
word=3D"-Sequenzen beinhalten.
Achtung, evtl. unerwartetes Feature: in den Strings werden ggf.
Perl-Variablen substituiert :-)
Re: Problem mit regulären Ausdrücken
am 25.04.2006 17:14:20 von Frank Seitz
Anton Berg wrote:
>
> eee="test6" fff="test7 8 9"/>
Die Zerlegung in die Attribut/Wert-Paare kannst Du so lösen:
@keyval = $str =~ /(\w+)="([^"]*)"/g;
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: Problem mit regulären Ausdrücken
am 25.04.2006 17:15:28 von Mirco Wahab
Hallo Anton
> ich habe ein kleines Problem mit regulären Ausdrücken, und zwar
> betrachte ich Strings, die in etwa wie fogt aufgebaut sind:
>
> eee="test6" fff="test7 8 9"/>
>
Mein Schnellschuss, da keiner antwortet
(sicher kommen heute abend noch bessere
Lösungen):
$text='';
$_ = $text;
%result = split( /=|"\s/, (/type_9 (.+?)\/>/, $1) );
for( sort keys %result ) {
print "$_ => $result{$_}\n";
}
Viele Grüße
M.
Re: Problem mit regulären Ausdrücken
am 25.04.2006 18:01:20 von Wolf Behrenhoff
Anton Berg schrieb:
> Hallo,
>
> ich habe ein kleines Problem mit regulären Ausdrücken, und zwar
> betrachte ich Strings, die in etwa wie fogt aufgebaut sind:
>
> eee="test6" fff="test7 8 9"/>
Wie wäre es mit:
use XML::Parser;
use Data::Dumper;
my $p = new XML::Parser(Style => 'Tree');
my %hash = %{$p->parse('
ddd="test4 test5"
eee="test6" fff="test7 8 9"/>')->[1][0]};
print Dumper \%hash;
Wolf