PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Perl, split mit Regex in gequotetem String



Angels Death
28-08-2003, 11:59
Hallo!

Jemand eine Idee, wie ich den String

0 172 "bla" "honkitonk lala" "schlabber"

in die 5 Teile

0
172
"bla"
"honkitonk lala"
"schlabber"

splitten könnte? Ich bin mir nicht sicher, ob sich "splitte an diesem Space, wenn sich davor im String nicht eine ungerade Anzahl an Whitespaces befindet" ausdrücken läßt. Bin für clevere Ideen offen.

AD!

peschmae
28-08-2003, 12:19
das Problem ist klar - aber der Satz darunter wirklich nicht :cool:

bitte nochmal für mich :)

MfG Peschmä

Angels Death
28-08-2003, 12:35
Die einzige Regel, die für alle Spaces gilt, an denen ich splitten will, ist folgende:

1. Der Parser erreicht das Space an Stelle X im String
2. Zähle die Anführungszeichen von Stelle 1 bis Stelle X-1
3. Ist diese Zahl gerade, befinde ich mich außerhalb eines gequoteten Strings und möchte an diesem Space umbrechen

AD!

TrollSlayer
28-08-2003, 13:13
my $str = "0 172 \"bla\" \"honkytonk lala\" \"schlaber\"";

while ($str =~ /(\d*\s)|(\"\w*(\s\w*)*\")/g)
{
if (not defined $1) {
print "$2\n";
} else {
print $1."\n";
}
}

Angels Death
28-08-2003, 13:28
Hallo!

Danke Trollslayer. Scheinbar ein Kommunikationsproblem. Ich wollte eine abstrakte Lösung. Das Problem ist das allgemeine Splitten beliebiger Strings unter der Prämisse, Whitespaces innerhalb eines gequoteten Strings zu ignorieren.

AD!

elrond
28-08-2003, 14:44
0 172 "bla" "honkitonk lala" "schlabber"

ich würde folgendes tun:
1. an den Hochkommas splitten
damit hast du

#0 0 172
#1 bla
#2
#3 honkitonk lala
#4
#5 schlabber

2. in den ungeraden Array-elementen die leerzeichen ersetzen und den string mit hochkommas wieder zusammenbauen

#0 0 172
#1 bla
#2
#3 honkitonk@lz@lala
#4
#5 schlabber

0 172 "bla" "honkitonk@lz@lala" "schlabber"

Dann kannst du 3. ohne verluse am leerzeichen splitten.

4. wird dann im resulierenden Array einfach @lz@ durch leerzeichen ersetzt

ps: bei den regexp breche ich mir auch jedesmal die finger, deshalb hier nur die vorgehensweise...

edit: geht wahrscheinlich einfacher, aber das hier funxt:


$str="0 172 \"bla\" \"honkitonk lala\" \"schlabber\"";
my @elm=split("\"",$str);
$str="";
for(my $i=0;$i<@elm;$i++) {
$elm[$i]=~ s/\s/\@LZ\@/g if($i % 2 ==1);
$str=$str.$elm[$i]."\"";
}
@elm=split(" ",$str);
for(my $i=0;$i<@elm;$i++) {
$elm[$i]=~ s/\@LZ\@/ /g ;
print $elm[$i]."\n";
}

peschmae
28-08-2003, 16:21
Jetzt ists klar.

Hab das gelesen:


Original geschrieben von Angels Death
"splitte an diesem Space, wenn sich davor im String nicht eine ungerade Anzahl an Whitespaces befindet"


und dann hä?

Whitespaces sind doch Tabs, Leerschläge und Newline-Zeichen (und Carriage-Return für die dies Brauchen ;))

MfG Peschmä

Angels Death
28-08-2003, 16:38
Hab' ja auch Bockmist geschrieben, müßte natürlich "Anführungszeichen" (Shift 2) heißen :mad:

AD!