2011-01-06 6 views
45
$text_to_search = "example text with [foo] and more"; 
$search_string = "[foo]"; 

if($text_to_search =~ m/$search_string/) print "wee"; 

Bitte obigen Code beachten. Aus irgendeinem Grund möchte ich den Text "[foo]" in der Variablen $ text_to_search finden und "wee" ausdrucken, wenn ich ihn finde. Um dies zu tun, müsste ich sicherstellen, dass [und] durch [und] ersetzt werden, damit Perl sie als Zeichen statt als Operatoren behandelt.Perl regulärer Ausdruck (Variable als Suchzeichenfolge mit Perl-Operator-Zeichen verwenden)

Frage: Wie kann ich dies tun, ohne vorher [ und ] mit ersetzen mit \[ und \] einen s/// Ausdruck verwenden?

+4

würde ich in die Gewohnheit, die qr // konstruieren für reguläre Ausdrücke und Flucht spezielle Regex Zeichen der Verwendung erhalten sagen, wenn wörtliche benötigt wird. QuoteMeta wird ALLE speziellen Regex-Zeichen angeben. Wenn Sie nur eine literale Zeichenfolge in einer anderen suchen möchten, verwenden Sie stattdessen index(). – sln

Antwort

52

Verwenden Sie \Q, um mögliche problematische Zeichen in Ihrer Variablen automatisch zu erkennen.

if($text_to_search =~ m/\Q$search_string/) print "wee"; 
+1

++. Nur der Vollständigkeit halber: Sie könnten die Funktion quotemeta für ein ähnliches Ergebnis verwenden: '$ text_to_search = quitemeta" Beispieltext mit [foo] und mehr ";/$ search_string/'Aber das wird $ text_to_search ändern, anstatt nur in der Regex zu quotieren. – Hugmeir

+1

@Hugmeir: Deshalb möchten Sie "quotemeta" den Teilstring, nach dem stattdessen suchen. Siehe meine Antwort. –

+0

Whoops, ja, mein Schlechter. – Hugmeir

45

Verwenden Sie die quotemeta Funktion:

$text_to_search = "example text with [foo] and more"; 
$search_string = quotemeta "[foo]"; 

print "wee" if ($text_to_search =~ /$search_string/); 
15

Wie schon Jungs geschrieben Sie quotemeta (\Q \E) wenn Ihr Perl ist 5.16+ aber wenn unter können Sie einfach vermeiden regexp mit überhaupt nutzen können.

zum Beispiel durch index Befehl

if (index($text_to_search, $search_string) > -1){ 
    print "wee"; 
}