ecs: Reguläre Ausdrücke: Ausschluß eines Teilstrings

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

  1. Servus,

    1. Am Anfang der Zeichenkette muss ein bestimmter Teilstring vorkommen, z.B. 'hund'.
    2. Danach darf ein bestimmer Teilstring nicht vorkommen, z.B. 'vogel'.

    zum Beispiel 'hund(?!.*vogel)'.

    Grüsse

    1. Danke für die schnellen Antworten! Lookahead-Assertions war genau das richtige Stichwort. :)

      Gruß, ecs

    2. gudn tach!

      1. Am Anfang der Zeichenkette muss ein bestimmter Teilstring vorkommen, z.B. 'hund'.
      2. 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

      1. 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

  2. Huhu

    Hat da jemand eine Idee?

    Beschäftige Dich mit lookahead assertions.

    Viele Grüße

    lulu

    --
    bythewaythewebsuxgoofflineandenjoytheday
  3. hi,

    1. Am Anfang der Zeichenkette muss ein bestimmter Teilstring vorkommen, z.B. 'hund'.

    strpos($zeichenkette, 'hund') === 0

    1. Danach darf ein bestimmer Teilstring nicht vorkommen, z.B. 'vogel'.

    strpos($zeichenkette, 'vogel') !== false

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. gudn tach!

      1. Danach darf ein bestimmer Teilstring nicht vorkommen, z.B. 'vogel'.

      strpos($zeichenkette, 'vogel') !== false

      ===

      prost
      seth

      1. hi,

        strpos($zeichenkette, 'vogel') !== false

        ===

        Jepp, klar. Danke für die Korrektur.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
  4. 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

    1. Moin!

      Ups! Da habe ich mal wieder zu kompliziert gedacht. Natürlich ist die ältere Antwort 'hund(?!.*vogel)' hier ausreichend!

      -- Skeeve