Jan: Regulärer Ausdruck

Hallo,
wie muss ein RegExp aussehen, der "alles außer 'test'" wählt?

Ich dachte an [^test], aber der tut es nicht...

MfG
Jan

  1. Hey Jan!

    Ich bin kann zwar kein PHP, aber Perl und ich glaube die regulären Ausdrücke sind da ziemlich ähnlich.

    Ich dachte an [^test], aber der tut es nicht...

    Erstmal so allgemein der Vorschlag: Mach doch einfach die umgekehrte Suche. Prüfe ob im Wort der Ausdruck test enthalten ist und negiere das Ergebnis.

    In Perl sieht das so aus

      
    if( $wort !~ /test/ )  
    {  
      print "$wort enthät nicht das Wort 'test'";  
    }  
    
    

    Schönen Abend
      ~ Thilo

    1. Das hilft mir leider nicht; ich brauch den regulären Ausdruck, kein Workaround :(

  2. Hallo,

    wie muss ein RegExp aussehen, der "alles außer 'test'" wählt?

    Gib ein paar Beispiele, welche Strings der Ausdruck matchen soll und welche nicht.

    lg
    Martin Dunst

    --
    Do what I say, not what I do.
    --Tim Berners-Lee
  3. Hi,

    wie muss ein RegExp aussehen, der "alles außer 'test'" wählt?

    sag doch bitte, wozu Du das brauchst bzw. was Du genau erreichen willst.
    Wenn Du z.B. lediglich das Wort 'test' aus dem String entfernen willst, ist str_replace geeigneter.

    freundliche Grüße
    Ingo

  4. Hallo Jan,

    wie muss ein RegExp aussehen, der "alles außer 'test'" wählt?

    Dann müsstest Du erst einmal definiern, was Du mit "alles außer" meinst... Gut, in jedem Fall wirst Du um negative Lookahead-Assertions nicht herumkommen, aber je nachdem, was Du genau erreichen willst, kann es kompliziert werden.

    Möglichkeit 1: Du willst jeden 4-buchstabigen String matchen, der NICHT test ist:

    $res = preg_match ('/^(?!test).{4}\z/', $string, $matches);

    Möglichkeit 2: Du willst jeden beliebigen String matchen, der test NICHT enthält:

    $res = preg_match ('/^(?!.*test.*).*\z/', $string, $matches);

    Möglichkeit 3: Du willst jeden beliebigen String matchen, der das Wort "test" NICHT enthält (es aber durchaus innerhalb von Wörtern wie "tester" oder so vorkommen kann):

    $res = preg_match ('/^(?!.*\btest\b.*).*\z/', $string, $matches);

    Möglichkeit 4: ...

    [Es gibt von jedem Ausdruck auch mögliche Variationen, die unter Umständen performanter oder imperformanter sind, meine habe ich wegen der Klarheit so gewählt.]

    Ich dachte an [^test], aber der tut es nicht...

    [^test] ist identisch zu [^tes] und das matcht genau EIN zeichen, das nicht t, e und s ist.

    Viele Grüße,
    Christian

    1. Hallo Jan,
      (...)
      Viele Grüße,
      Christian

      Auch wenn ich nicht der OP bin, muss ich dir einfach mal meinen Dank aussprechen. So etwas ähnliches habe ich nämlich auch schonmal gefragt und deutlich unqualifiziertere Antworten bekommen. *Thumbs up*
      Du hast meine Hochachtung.

    2. gudn tach!

      $res = preg_match ('/^(?!test).{4}\z/', $string, $matches);

      wobei hier die von dir bereits angesprochenen alternativen besser (besser lesbar, wartbar und meist auch schneller) sind:
      also a.b. string$ !== 'test';

      Möglichkeit 2: Du willst jeden beliebigen String matchen, der test NICHT enthält:

      $res = preg_match ('/^(?!.*test.*).*\z/', $string, $matches);

      da ist einiges redundant. die aufgabenstellung der moeglichkeit 2 wird bereits von

      if(preg_match('/^(?!.*test)/', $string)) $matches=$string;

      erfuellt (wenn php sich hier nicht anders verhaelt als perl).

      Möglichkeit 3: Du willst jeden beliebigen String matchen, der das Wort "test" NICHT enthält (es aber durchaus innerhalb von Wörtern wie "tester" oder so vorkommen kann):

      $res = preg_match ('/^(?!.*\btest\b.*).*\z/', $string, $matches);

      analog zu oben sollte

      /^(?!.*\btest\b)/

      genuegen.

      [Es gibt von jedem Ausdruck auch mögliche Variationen, die unter Umständen performanter oder imperformanter sind, meine habe ich wegen der Klarheit so gewählt.]

      klarheit ist natuerlich nicht fuer jeden das gleiche. ich finde die reduzierten beispiele leichter verstaendlich.

      prost
      seth