2010-01-28 21 views
11

Tengo una cadena que puede contener caracteres especiales como: $, (, @, #, etc. Necesito poder realizar expresiones regulares en esa cadena.¿Cómo puedo escapar de caracteres especiales en una cadena que interpolar en una expresión regular de Perl?

En este momento, si mi cadena tiene alguno de estos caracteres, la expresión regular parece quebrar, ya que estos son caracteres reservados para expresiones regulares.

¿Alguien sabe un buen subrutina que escaparía bien cualquiera de estos caracteres para mí, así que después pude hacer algo como:

$p_id =~ /^$key/ 
+0

Duplicado: http://stackoverflow.com/questions/2135519/why-does-my-regular-expression-fail-with-certain-substitutions –

+1

posible duplicado de [¿Cómo manejo los caracteres especiales en un Perl regex? ] (http://stackoverflow.com/questions/576435/how-do-i-handle-special-characters-in-a-perl-regex) – daxim

Respuesta

20
$p_id =~ /^\Q$key\E/; 
+0

¿Qué hace \ Q y \ E? – goe

+2

Cita y término final. Significa que $ key se trata como una cadena sin caracteres especiales. – Steven

+1

@goe, citan los metacaracteres. – daotoad

6

Desde su descripción, parece que lo tienes al revés . No necesita escapar de los caracteres en la cadena con la que está haciendo la coincidencia ($ p_id), necesita escapar de la cadena de coincidencia '^ $ key'.

Dado:

$p_id = '$key$^%*&#@^&%$blah!!'; 

Uso:

$p_id =~ /^\$key/; 

o

$p_id =~ /^\Q$key\E/; 

El \ Q, par \ E tratar todo en el medio como literal. En otras palabras, no desea buscar el contenido de la variable $ key, sino la cadena real '$ key'. El primer ejemplo simplemente escapa de $.

Cuestiones relacionadas