TS: pregexp Schlüsselwörter in beliebiger Reihenfolge

Hello,

ich rätsele darüber, ob man mit Perl kompatiblen Regualar Expressions folgendes erreichen kann:

zwei oder mehrere Schlüsselwörter tauchen im Text in beliebiger Reihenfolge auf. Aber nur, wenn beide oder alle enthalten sind, matcht das Pattern.

Liebe Grüße
Tom S.

--
Die Krawatte ist das Kopftuch des Westens
  1. hallo

    Hello,

    ich rätsele darüber, ob man mit Perl kompatiblen Regualar Expressions folgendes erreichen kann:

    zwei oder mehrere Schlüsselwörter tauchen im Text in beliebiger Reihenfolge auf. Aber nur, wenn beide oder alle enthalten sind, matcht das Pattern.

    Liebe Grüße
    Tom S.

    Mein üblicher Ansatz wäre

    sub match_all{
      my $teststring=shift||'';
      my @mustmatch = @_;
      @mustmatch or return 1;
    
      while (@mustmatch){
        $teststring =~ m{$_} or return undef;
        #oder
        # ( index($teststring, $_) > -1 ) or return undef;
      }
      return 1;
    }
    
    1. Hello,

      ich rätsele darüber, ob man mit Perl kompatiblen Regualar Expressions folgendes erreichen kann:

      zwei oder mehrere Schlüsselwörter tauchen im Text in beliebiger Reihenfolge auf. Aber nur, wenn beide oder alle enthalten sind, matcht das Pattern.

      Mein üblicher Ansatz wäre

      sub match_all{
        my $teststring=shift||'';
        my @mustmatch = @_;
        @mustmatch or return 1;
      
        while (@mustmatch){
          $teststring =~ m{$_} or return undef;
          #oder
          # ( index($teststring, $_) > -1 ) or return undef;
        }
        return 1;
      }
      

      Da muss ich jetzt aber wirklich nachdenken, wie ich das als einzeiliges Pattern für die Postfix-Filter übersetze. Die weiterreichenden Methoden und Module, wie milter, habe ich leider noch nicht verstanden.

      Liebe Grüße
      Tom S.

      --
      Die Krawatte ist das Kopftuch des Westens
  2. Du hast keinen Kontext genannt, in dem Du das einsetzen willst. Milter klingt nach Mails, d.h. du hast keinen eigenen Code, in den Du das einbetten kannst?

    Wie wär's hiermit? Benötigt die Singleline-Option (inline-Flag s), um über Zeilenumbrüche hinweg zu schauen. Von Performance rede ich lieber nicht, de facto macht das Ding drei Matches.

    (?=.*\bRing\b.*)(?=.*\bbinden\b.*).*\bDunkel\b.*
    

    Mein Teststring bei regex101:

    Ein Ring, sie zu knechten, sie alle zu finden
    ins Dunkel zu treiben und ewig zu binden
    

    Wenn das Ganze in PHP mit deinem eigenen Code läuft, geht es ohne Lookahead und müsste schneller sein. Ich habe noch dazugeschrieben, wie man aus einem Wörter-Array eine Regex baut (das Array darf nur nicht zu groß werden :) ). Etwas ähnliches sollte auch in PERL gehen.

    $test = <<<END
    Ein Ring, sie zu knechten, sie alle zu finden
    ins Dunkel zu treiben und ewig zu binden
    END;
    
    $words = [ "Ring", "Dunkel", "binden" ];
    $regexp = "/\b(" + implode($words, "|") + ")\b/s";
    $matches = preg_match_all($regex, $test);
    if ($matches == count($words))
       echo "alles ok";
    

    Rolf

    1. Hallo Rolf b,

      Mein Teststring bei regex101:

      Dort kann man die Projekte auch speichern: https://regex101.com/r/D3cQna/1

      Bis demnächst
      Matthias

      --
      Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.