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

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

Si prega di osservare il codice sopra. Per qualche motivo mi piacerebbe trovare il testo "[foo]" nella variabile $ text_to_search e stampare "wee" se lo trovo. Per fare questo, dovrei assicurarmi che [e] sia sostituito con [e] per far sì che Perl lo tratti come caratteri invece che come operatori.Perl espressione regolare (utilizzando variabile come stringa di ricerca con caratteri operatore perl inclusi)

Domanda: Come posso fare questo senza dover sostituire prima [ e ] con \[ e \] utilizzando un'espressione s///?

+4

direi prendere l'abitudine di utilizzare il qr // costrutto per le espressioni regolari e sfuggire caratteri speciali regex se è necessario letterale. Quotemeta citerà TUTTI i caratteri speciali regex. Se vuoi semplicemente trovare una stringa letterale in un'altra, usa invece index(). – sln

risposta

52

Utilizzare \Q per eseguire il controllo automatico di eventuali caratteri potenzialmente problematici nella variabile.

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

++. Semplicemente per completezza: potresti usare la funzione quotemeta per un risultato simile: '$ text_to_search = quotemeta" testo di esempio con [pippo] e altro ";/$ search_string/'Ma questo cambierà $ text_to_search, piuttosto che quotemeta'ing solo all'interno della regex. – Hugmeir

+1

@Hugmeir: Ecco perché vuoi "quotemeta" la sottostringa da cercare. Vedi la mia risposta. –

+0

Whoops, si, mio ​​cattivo. – Hugmeir

45

utilizzare la funzione quotemeta:

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

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

Come ragazzi già scritto è possibile utilizzare quotemeta (\Q \E) se il Perl è 5.16+, ma se sotto si può semplicemente evitare di usare espressioni regolari a tutti.

ad esempio utilizzando il comando index

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