2010-03-16 19 views
8
if($title =~ s/(\s|^|,|\/|;|\|)$replace(\s|$|,|\/|;|\|)//ig) 

$ título puede ser un conjunto de títulos que van desde el presidente, MD, gerente, director general, ...¿Por qué mi Perl regex se queja de "Inigualable) en expresiones regulares"?

$ reemplazar puede ser (accionista), (propietario) o similares.

Sigo recibiendo este error. He comprobado para el equilibrado incorrectamente '(', ')', no dados :(

Unmatched) in regex; marked by <-- HERE in m/(\s|^|,|/|;|\|)Owner) <-- HERE (\s|$|,|/|;|\|)/ 

Si usted podría decirme lo que hace la expresión regular, que sería impresionante. ¿Se tira de esos símbolos? Gracias chicos!

+0

Si tiene metacaracteres en $ replace, debe usar \ Q o quotemeta para considerar que los caracteres son caracteres normales – sganesh

+0

http://stackoverflow.com/questions/576435/how-do-i-handle-special- characters-in-a-perl-regex – daxim

Respuesta

14

Si la variable $ reemplazar puede contener meta-caracteres de expresiones regulares que debe envolver en \Q...\E

\Q$replace\E 

Para citar Jeffrey Friedl de Mastering Regular Expresiones

texto literal Span La secuencia \ Q "Citas" expresiones regulares metacaracteres (es decir, pone una barra invertida delante de ellos) hasta el final de la cadena, o hasta que un \ E secuencia .

+0

¡Corto y dulce! Hizo el trabajo. ¿Podría por favor elaborar \ Q y \ E? – ThinkCode

+0

agregó una breve explicación. –

3

parece que la variable de $replace contiene la cadena Owner), no (Owner)


$title = "Foo Owner Bar"; 
$replace = "Owner)"; 
if($title =~ s/(\s|^|,|\/|;|\|)$replace(\s|$|,|\/|;|\|)//ig) { 
    print $title; 
} 

de salida:.

 
Unmatched) in regex; marked by <-- HERE in m/(\s|^|,|/|;|\|)Owner)<-- HERE (\s 
|$|,|/|;|\|)/ at test.pl line 3. 

$title = "Foo Owner Bar"; 
$replace = "(Owner)"; 
if($title =~ s/(\s|^|,|\/|;|\|)$replace(\s|$|,|\/|;|\|)//ig) { 
    print $title; 
} 

Salida:

FooBar 
5

Como se ha mencionado, de TIRA esos símbolos de puntuación, seguido por el contenido de $ sustituyen, a continuación, más símbolos de puntuación, y que está fallando debido a $ reemplazar a su vez contiene un paréntesis no coincidentes.

Sin embargo, algunas otras cosas de expresiones regulares generales: primero, en lugar de ORear todo junto (y esto es solo para simplificar la lógica y el tipeo) los mantendría juntos en una clase de caracteres. coincidiendo con [\s^,\/;\|] es potencialmente menos propenso a errores y amigable para los dedos.

En segundo lugar, no utilice la agrupación de paréntesis un conjunto de () a menos que realmente lo diga. Esto coloca la cadena capturada en los búferes de captura e incurre en gastos generales en el motor de expresiones regulares. Por perldoc perlre:

ADVERTENCIA: Una vez que Perl ve que necesita uno de los $ &, $ `o $ 'en cualquier parte del programa, debe proporcionarlos para cada coincidencia de patrón. Esto puede ralentizar sustancialmente su programa. Perl usa el mismo mecanismo para producir $ 1, $ 2, etc., por lo que también paga un precio por cada patrón que contenga paréntesis de captura.Source

Usted puede conseguir fácilmente en torno a esta tan solo cambiando añadiendo ?: al paréntesis:

(?:[\s^,\/;\|])

Editar: no es que necesidad no capturar la agrupación en esa instancia, pero es ya en la expresión regular original.

+0

+1, pero creo que el '^' y el '$' fueron entendidos como anclajes, por lo que no pueden entrar dentro de las clases de caracteres. Eso significa que los grupos * son * necesarios: '(?:^| [\ S,; | \ /])', '(?: [\ S,; | \ /] | $)' –

+0

Aprendí algo nuevo. \ Q $ replace \ E solucionó el problema, pero muchas gracias Marc. – ThinkCode

Cuestiones relacionadas