pregexp Schlüsselwörter in beliebiger Reihenfolge
TS
- regex
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.
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;
}
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.
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
Hallo Rolf b,
Mein Teststring bei regex101:
Dort kann man die Projekte auch speichern: https://regex101.com/r/D3cQna/1
Bis demnächst
Matthias