2 Stimmen

Wie kann ich erreichen, dass mein Perl Regex keine Sonderzeichen aus einer interpolierten Variablen verwendet?

Mögliche Duplikate:
Wie kann ich Metazeichen maskieren, wenn ich eine Variable im Match-Operator von Perl interpoliere?

Ich benutze den folgenden Regex, um nach einem String $word im größeren String $referenceLine zu suchen :

$wordRefMatchCount =()= $referenceLine =~ /(?=\b$word\b)/g

Das Problem tritt auf, wenn mein Teilstring $word einige ( enthält. Weil es dies als Teil des Regex anstatt des zu suchenden Strings interpretiert und den folgenden Fehler ausgibt :

Unmatched ( in regex; marked by <-- HERE in 
m/( <-- HERE ?=\b( darsheel safary\b)/ 
at ./bleu.pl line 119,  line 1.

Kann mir bitte jemand eine Lösung dafür geben? Ich denke, wenn ich Perl irgendwie dazu bringen könnte zu verstehen, dass wir den gesamten $word suchen wollen, wie es ist, ohne es auszuwerten, könnte es klappen.

11voto

Tim Pietzcker Punkte 311448

Verwenden

$wordRefMatchCount =()= $referenceLine =~ /(?=\b\Q$word\E\b)/g

um dem Regex-Motor mitzuteilen, dass jedes Zeichen in $word als buchstäbliches Zeichen behandelt werden soll.

\Q markiert den Anfang, \E markiert das Ende eines buchstäblichen Strings im Perl-Regex.

Alternativ könnten Sie auch

$quote_word = quotemeta($word);

und dann verwenden

$wordRefMatchCount =()= $referenceLine =~ /(?=\b$quote_word\b)/g

Noch etwas (hier aus den Kommentaren übernommen, wo es schwerer zu finden ist:

Ihr Regex funktioniert in Ihrem Beispiel nicht aufgrund des Wortgrenzenankers \b. Dieser Anker passt zwischen einem Wortzeichen und einem Nicht-Wortzeichen. Es macht nur Sinn, wenn es um tatsächliche Wörter herum platziert wird, d. h. \bbar\b, um sicherzustellen, dass nur bar übereinstimmt, nicht foobar oder barbaric. Wenn Sie es um Nicht-Wörter herum platzieren (wie in \b( darsheel safary\b), dann wird die Übereinstimmung fehlschlagen (es sei denn, es steht ein Buchstabe, eine Ziffer oder ein Unterstrich direkt vor dem ().

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X