Problem mit regulären Ausdrücken

Hallo,

ich habe ein kleines Problem mit regulären Ausdrücken, und zwar
betrachte ich Strings, die in etwa wie fogt aufgebaut sind:
<type_9 aaa=3D"test1" bbb=3D"test2" ccc=3D"test3" ddd=3D"test4 test5"
eee=3D"test6" fff=3D"test7 8 9"/>

Ich will nun das <type_9 wegschneiden und das Paar Name (jeweils vor
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~ /<type_9 (.*)>/) {
my [at] 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
Anton Berg [ Di, 25 April 2006 16:35 ] [ ID #1289347 ]

Re: Problem mit regulären Ausdrücken

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:
> <type_9 aaa=3D"test1" bbb=3D"test2" ccc=3D"test3" ddd=3D"test4 test5"
> eee=3D"test6" fff=3D"test7 8 9"/>
>
> Ich will nun das <type_9 wegschneiden und das Paar Name (jeweils vor
> 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 '<type_9 aaa=3D"test1" bbb=3D"test2" ccc=3D"test3" ddd=3D"test4 t=
est5"
> eee=3D"test6" fff=3D"test7 8 9"/>'
$x =3D~ s/<type_9/(/;
$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 :-)
Ingo Menger [ Di, 25 April 2006 17:01 ] [ ID #1289348 ]

Re: Problem mit regulären Ausdrücken

Anton Berg wrote:

> <type_9 aaa="test1" bbb="test2" ccc="test3" ddd="test4 test5"
> eee="test6" fff="test7 8 9"/>

Die Zerlegung in die Attribut/Wert-Paare kannst Du so lösen:

[at] 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
Frank Seitz [ Di, 25 April 2006 17:14 ] [ ID #1289349 ]

Re: Problem mit regulären Ausdrücken

Hallo Anton

> ich habe ein kleines Problem mit regulären Ausdrücken, und zwar
> betrachte ich Strings, die in etwa wie fogt aufgebaut sind:
> <type_9 aaa="test1" bbb="test2" ccc="test3" ddd="test4 test5"
> eee="test6" fff="test7 8 9"/>
>

Mein Schnellschuss, da keiner antwortet
(sicher kommen heute abend noch bessere
Lösungen):

$text='<type_9 aaa="test1" bbb="test2" ccc="test3" ddd="test4 test5" eee="test6" fff="test7 8 9"/>';

$_ = $text;
%result = split( /=|"\s/, (/type_9 (.+?)\/>/, $1) );

for( sort keys %result ) {
print "$_ => $result{$_}\n";
}


Viele Grüße

M.
Mirco Wahab [ Di, 25 April 2006 17:15 ] [ ID #1289350 ]

Re: Problem mit regulären Ausdrücken

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:
> <type_9 aaa="test1" bbb="test2" ccc="test3" ddd="test4 test5"
> 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('<type_9 aaa="test1" bbb="test2" ccc="test3"
ddd="test4 test5"
eee="test6" fff="test7 8 9"/>')->[1][0]};

print Dumper \%hash;

Wolf
Wolf Behrenhoff [ Di, 25 April 2006 18:01 ] [ ID #1289351 ]
Perl » de.comp.lang.perl.misc » Problem mit regulären Ausdrücken

Vorheriges Thema: uninitialized value in string
Nächstes Thema: Menue-Auswahl auf Kommandozeile