2012-02-11 26 views
8

que tiene una cadena $regexp_as_stringPerl expresión regular cómo escapar sólo algunos caracteres

Ahora quiero "convertir" en una expresión regular/utilizarlo como expresión regular

if ($text_to_search =~ $regexp_as_string) 
{ 
... 
} 

Ahora hay personajes como". " y yo quiero escapar automaticamente ellos - \ Q y \ E debería hacer eso

if ($text_to_search =~ /\Q$regexp_as_string\E/) 
    { 
    ... 
    } 

¿Hay una manera de especificar una lista de caracteres que debe ser automático escapado? Porque en este momento el auto escapa, por ejemplo, "|" , pero quiero mantener eso.

Respuesta

14

Puede preparar la cadena usando quotemeta, luego eliminar las barras invertidas de forma selectiva. Ej .:

my $str = quotemeta('foo${}|'); 
$str =~ s/\\(?=[|])//g; 
say $str; 

Salida:

foo\$\{\}| 

Añadir los caracteres que no desea que se escapó a la clase de caracteres en la sustitución, por ejemplo, [|?()].

0

Quizás en lugar de pasar una cadena unida por | para las alternancias, obtenga la lista de alternancias y compórtelas en una cadena (o incluso divídalas por | si eso garantiza que nunca aparecerá). Algo así como:

my @alternations = array_returning_function(); 
# my @alternations = split(/\|/, string_returning_function()); 
my $regexp_as_string = join('|', map(quotemeta, @alternations)); 

o utilizar Data::Munge 's función list2re:

use Data::Munge; 
my @alternations = array_returning_function(); 
# my @alternations = split(/\|/, string_returning_function()); 
my $regexp_as_string = Data::Munge::list2re(@alternations); 
0

utilizando ejemplo de cadena de TLP

my $str='foo${}|'; 
$str =~ s/([\.\{\}\$])/\\$1/g; 
print $str; 

Esto sólo añadir una barra invertida a personajes que se encuentran en los corchetes "clase de caracteres"

Tenga en cuenta que he puesto una barra negra en frente de los personajes en los corchetes. Esto no siempre es necesario para todos los personajes en este contexto, pero es más fácil agregar una barra invertida y no preocuparse por ello.

+0

Corrección: es más fácil encontrar de una vez por todas los caracteres que necesita para escapar dentro de una clase de caracteres (los corchetes), y * luego * no se preocupe: '-] \^$' son los únicos metacaracteres de los que debes preocuparte, e incluso entonces, principalmente se trata de cómo los usas. Por ejemplo: '[]]' y '[abc ^]' y '[a-z-]' están bien. Ver http://perldoc.perl.org/perlrequick.html#Using-character-classes – TLP

Cuestiones relacionadas