Von perlfaq6 ‚s Antwort auf How do I match a regular expression that's in a variable?:
Wir haben nicht zu hart Codemuster in den Match-Operator (oder irgendetwas anderes, das mit regulären Ausdrücken arbeitet). Wir können das Muster zur späteren Verwendung in eine Variable einfügen.
Der Übereinstimmungsoperator ist ein doppelter Anführungszeichenkontext, so dass Sie Ihre Variable wie eine doppelte Anführungszeichenfolge interpolieren können. In diesem Fall lesen Sie den regulären Ausdruck als Benutzereingabe und speichern ihn in $ regex. Sobald Sie das Muster in $ regex haben, verwenden Sie diese Variable im Match-Operator.
chomp(my $regex = <STDIN>);
if($string =~ m/$regex/) { ... }
Alle regulären Ausdruck Sonderzeichen in $ regex sind noch besondere, und das Muster immer noch gültig sein oder Perl wird sich beschweren. Zum Beispiel gibt es in diesem Muster eine ungepaarte Klammer.
Wenn Perl den regulären Ausdruck kompiliert, behandelt es die Klammer als den Beginn einer Speicherübereinstimmung.Wenn es nicht die schließende Klammer finden, es klagt:
Unmatched (in regex; marked by <-- HERE in m/Unmatched (<-- HERE paren/ at script line 3.
Sie, um dies auf verschiedene Weise erhalten Sie auf unserer Situation abhängig. Erstens, wenn Sie nicht möchten, dass eines der Zeichen in der Zeichenfolge speziell ist, können Sie sie mit quitemeta vor der Verwendung der Zeichenfolge umgehen.
Sie können dies auch direkt im Match-Operator mit den Sequenzen \ Q und \ E tun. Das \ Q teilt Perl mit, wo Sonderzeichen zu entkommen sind, und das \ E sagt ihm, wo es anhalten soll (siehe Perl für weitere Details).
Alternativ können Sie qr //, den regulären Ausdruck-Anführungsoperator verwenden (siehe perlop für weitere Details). Es zitiert und vielleicht kompiliert das Muster, und Sie können Flags für reguläre Ausdrücke auf das Muster anwenden.
Sie könnten auch Fehler abfangen wollen, indem Sie einen Eval-Block um das Ganze wickeln.
chomp(my $input = <STDIN>);
eval {
if($string =~ m/\Q$input\E/) { ... }
};
warn [email protected] if [email protected];
Oder ...
my $regex = eval { qr/$input/is };
if(defined $regex) {
$string =~ m/$regex/;
}
else {
warn [email protected];
}
Siehe http://stackoverflow.com/questions/1949731/how-can-i-escape-a-literal-string-i- interpolieren in einen regulären Ausdruck –
mögliches Duplikat von [Wie handle ich Sonderzeichen in einer Perl-Regex?] (http://stackoverflow.com/questions/576435/how-do-i-handle -special-characters-in-a-per-regex) – daxim