Reguläre Ausdrücke: Ausschluß eines Teilstrings
ecs
- programmiertechnik
0 s.oliver0 ecs0 seth_not@home
0 lulu0 wahsaga0 seth_not@home0 wahsaga
0 Skeeve0 Skeeve
Hallo,
ich bin auf der Suche nach einem regulären Ausdruck, der eine beliebige Zeichenkette auf zwei Bedingungen überprüfen soll:
1. Am Anfang der Zeichenkette muss ein bestimmter Teilstring vorkommen, z.B. 'hund'.
2. Danach darf ein bestimmer Teilstring nicht vorkommen, z.B. 'vogel'.
Beispiel: "hund,katze,maus,fisch" soll wahr liefern, während "hund,katze,maus,vogel,fisch" false liefern soll.
Hat da jemand eine Idee?
Gruß, ecs
Servus,
- Am Anfang der Zeichenkette muss ein bestimmter Teilstring vorkommen, z.B. 'hund'.
- Danach darf ein bestimmer Teilstring nicht vorkommen, z.B. 'vogel'.
zum Beispiel 'hund(?!.*vogel)'.
Grüsse
Danke für die schnellen Antworten! Lookahead-Assertions war genau das richtige Stichwort. :)
Gruß, ecs
gudn tach!
- Am Anfang der Zeichenkette muss ein bestimmter Teilstring vorkommen, z.B. 'hund'.
- Danach darf ein bestimmer Teilstring nicht vorkommen, z.B. 'vogel'.
zum Beispiel 'hund(?!.*vogel)'.
nee.
afais matcht
/hund(?!.*vogel)/;
immer, sobald 'hund' im string vorkommt. das /.*/ kann naemlich immer so angepasst werden, dass der ausdruck matcht.
prost
seth
gudn tach!
zum Beispiel 'hund(?!.*vogel)'.
nee.
doch!
afais matcht
/hund(?!.*vogel)/;
immer, sobald 'hund' im string vorkommt. das /.*/ kann naemlich immer so angepasst werden, dass der ausdruck matcht.
bloedsinn! bloedsinn! bloedsinn!
/hund(?!.*vogel)/;
matcht nur 'hund', dem kein string folgt, auf den /.*vogel/ matcht.
somit war s.olivers anwort richtig.
prost
seth
Huhu
Hat da jemand eine Idee?
Beschäftige Dich mit lookahead assertions.
Viele Grüße
lulu
hi,
- Am Anfang der Zeichenkette muss ein bestimmter Teilstring vorkommen, z.B. 'hund'.
strpos($zeichenkette, 'hund') === 0
- Danach darf ein bestimmer Teilstring nicht vorkommen, z.B. 'vogel'.
strpos($zeichenkette, 'vogel') !== false
gruß,
wahsaga
gudn tach!
- Danach darf ein bestimmer Teilstring nicht vorkommen, z.B. 'vogel'.
strpos($zeichenkette, 'vogel') !== false
===
prost
seth
hi,
strpos($zeichenkette, 'vogel') !== false
===
Jepp, klar. Danke für die Korrektur.
gruß,
wahsaga
Moin!
Hat da jemand eine Idee?
Allgemein wirst Du das nur mit 2 regulären Ausdrücken lösen können. In perl z.B.:
my $tiere= '';
foreach(qw/elefant hund katze maus vogel fisch/) {
$tiere.= $_ . ',';
my $hund= ( $tiere=~ /hund(.*)$/);
my $vogel_nach_hund= ( $1=~ /vogel/ );
print "$tiere =>";
print " hund: ",$hund ? "ja" : "nein";
print ", vogel nach Hund: ", $vogel_nach_hund ? "ja":"nein";
print " gesamt: ", $hund && ! $vogel_nach_hund ? "okay":"nicht okay";
print "\n";
}
Liefert:
elefant, => hund: nein, vogel nach Hund: nein gesamt: nicht okay
elefant,hund, => hund: ja, vogel nach Hund: nein gesamt: okay
elefant,hund,katze, => hund: ja, vogel nach Hund: nein gesamt: okay
elefant,hund,katze,maus, => hund: ja, vogel nach Hund: nein gesamt: okay
elefant,hund,katze,maus,vogel, => hund: ja, vogel nach Hund: ja gesamt: nicht okay
elefant,hund,katze,maus,vogel,fisch, => hund: ja, vogel nach Hund: ja gesamt: nicht okay
Wenn es unbedingt ein einziger Ausdruck sein muß, kannst Du Dir im speziellen mit einem Wust von Alternativen behelfen, im speziellen also:
/hund(?:[^v]|v[^o]|vo[^g]|vog[^e]]voge[^l])*$/
und als Beispiel:
my $tiere= '';
foreach(qw/elefant hund katze maus vogel fisch/) {
$tiere.= $_ . ',';
my $voegelei= ( $tiere=~/hund(?:[^v]|v[^o]|vo[^g]|vog[^e]]voge[^l])*$/);
print "$tiere => ";
print $voegelei ? "okay":"nicht okay";
print "\n";
}
-- Skeeve
Moin!
Ups! Da habe ich mal wieder zu kompliziert gedacht. Natürlich ist die ältere Antwort 'hund(?!.*vogel)' hier ausreichend!
-- Skeeve