Reg. Expression >> Zeichenkette aufteilen
Flo
- perl
Hallo alle,
ich habe eine Zeichenkette und diese möchte ich aufteilen und in ein Array schreiben. Und zwar so:
push(@array, split(/\s+/,$zeichenkette) );
Nur leider kommt auch mal ein String mit "Wort 1" und dort soll er nicht beim Leerzeichen aufhören, sondern eben "Wort 1" und erst danach.
Wie kann man so eine Ausnahme angeben? Vielen Dank
Flo
Hi,
Wie kann man so eine Ausnahme angeben? Vielen Dank
zuerst solltest du exakt und verallgemeinert definieren, was die Regel und was die Ausnahme ist.
Gruß
MrWurf
Hallo,
ja die Regel ist immer ein Wort nehmen und bei Leerzeichen wieder aufhören und das nächste nehmen. Nur kommen jetzt Wörter mit "..." vor und dort soll nicht bei einem Leerzeichen der nächste Wert genommen werden.
Hi,
ja die Regel ist immer ein Wort nehmen und bei Leerzeichen wieder aufhören und das nächste nehmen. Nur kommen jetzt Wörter mit "..." vor und dort soll nicht bei einem Leerzeichen der nächste Wert genommen werden.
da ist vermutlich eine Iteration besser als das Splitten:
So ungefähr: (nicht gestestet)
while( $zeile=~/\s(\S+)\s|"(.+?)"/g )
{
my $neues_wort = $1;
}
wird nicht für das erste und letzte Wort funktionieren, aber als Ansatz ausreichend.
Gruß
MrWurf
push(@array, split(/\s+/,$zeichenkette) );
my @array = split /\s+/, $zeichenkette;
Nur leider kommt auch mal ein String mit "Wort 1" und dort soll er nicht beim Leerzeichen aufhören, sondern eben "Wort 1" und erst danach. Wie kann man so eine Ausnahme angeben?
Negatives Lookahead sollte helfen:
my $string = 'Wort 1 Wort 2 Wort 3';
my @liste = split /\s+(?!\d)/, $string;
print join "\n", @liste;
Das Lookahead-Konstrukt musst du, wie MrWurf schon anmerkte, an deine Gegebenheiten anpassen, die wir nicht kennen.
Siechfred
Leider ist mir jetzt nicht ganz klar wie du das meinst. Ich habe einen Text mit
Hallo ich bins der "Sieg fried" jetzt möchte ich ein Array mit:
0: Hallo
1: ich
2: bins
3: der
4: "Sieg fried"
Wie kann ich denn sowas machen?
Vielen Dank
Flo
Hey,
das ist ein Fall von ausgeglichenem Text. Dafür braucht man Spezialwerkzeug.
#!perl -T
use strict;
use diagnostics;
use Data::Dump::Streamer;
use Text::Balanced qw(extract_delimited);
our $seperator = ' ';
our $balancedseperator = '"';
sub parse {
# take $string
# return $remainder_of_string, [@parts_split_by_seperator]
$_ = shift;
my ($head, $tail);
if (/^$balancedseperator/) {
($head, $tail) = extract_delimited $_, $balancedseperator;
return $tail, [$head];
} else {
if (/$balancedseperator/) {
($head, $tail) = /(.*?)($balancedseperator.*)/;
return $tail, [split $seperator, $head];
} else {
return '', [split $seperator, $_];
};
};
};
# --
while (<DATA>) {
chomp;
my @parts;
while (length) {
my ($remainder, $partsref) = parse $_;
push @parts, grep {length} @{$partsref};
$_ = $remainder;
};
Dump [@parts];
};
__DATA__
Hallo ich bins der "Sieg fried"
"Sieg fried" halli hallo
Hallo "Sieg fried" du da "Sieg fried" la bla gna
foo bar baz
"Sieg fried"
Die Sub parse beackert den übergebenen String solange, bis von ihm nichts übrig bleibt.