2011-04-04 15 views
5

Estaba tratando de encontrar las citas elegantes" de una cadena utilizando la siguiente expresión regular de Perl pero devuelve falso.Expresión regular de Perl no puede encontrar citas sofisticadas "

$text = "NBN “a joint venture with Telstra”"; 

if ($text =~ m/“/) 
{ 
    print "found"; 
} 

También he intentado usar "\x93" código ASCII, pero todavía no funciona. Estoy atrapado aquí.

Cualquier ayuda es apreciada.

Saludos, Allen

+0

He probado su expresión regular en http://www.regextester.com/ y funcionó. Pero solo encontró la primera cita. En cuanto a su pregunta, no he escrito nada en perla, pero por lo que he visto otras expresiones regulares en perlas estaban escribiendo, por ejemplo, '$ vmsn = ~/(. + \. Vmsn)/xm;', por lo que su expresión regular parece '/"/m'. –

+3

El '" '(U + 201C) no está en el juego de caracteres US-ASCII. – Gumbo

+0

@ MPękalski, tienes razón. Probé la expresión regular usando una herramienta de evaluación y funcionó. Pero simplemente no funcionó en el script de Perl. – Allen

Respuesta

3

Dependiendo de la codificación de la cadena que está intentando establecer la concordancia, puede que tenga que hacer cosas diferentes. Ver The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!).

Si la cadena de entrada está codificada en UTF-8, entonces necesita especificar esa codificación en su script perl - una forma de hacerlo es con use encoding 'UTF-8'.

También puede especificar use utf8 si desea que la codificación del script sea UTF-8. Usted es probablemente mejor, sin embargo, conociendo el punto de que el carácter que está mirando para el código, y especificando directamente:

use utf8; 
use encoding 'UTF-8'; 

$text = "NBN “a joint venture with Telstra”"; # Make sure to quote this string properly 

if ($text =~ m/\N{U+201C}/) # “ is the same as U+201C LEFT DOUBLE QUOTATION MARK 
{ 
    print "found"; 
} 
+1

@Avi: cierre el corchete '/ \ N {U + 201C} /' – Toto

+0

Gracias Avi. ¡Funciona! Me tomó casi una hora y todavía no podía entender qué sucedía. Tu ayuda es muy apreciada. Ciertamente revisaré el artículo que me recomendó, ¡sin excusas! – Allen

+1

Si usa "utf8", asegúrese de que su código fuente sea realmente utf8;) –

1

Véase el "Demoroniser" y para su problema específico, la discusión de tan sólo las comillas "inteligentes" un poco de eso en Perlmonks Re^3: Reg Ex to strip MS smart quotes.

Este consejo está asumiendo - tal vez erróneamente - que "las cotizaciones de fantasía" de su base de datos han venido de alguna pieza de software de Microsoft producir Windows-1252 texto codificado - si tienes UTF-8 lugar, Avi ya se señaló en la dirección correcta.

+0

[Text :: Demoroniser] (http://p3rl.org/Text::Demoroniser) también disponible en CPAN. – daxim

0

Recientemente encontré algunas citas inteligentes que no pude eliminar utilizando las expresiones regulares mencionadas en las publicaciones anteriores solamente. Tuve que hacer un truco que encontré completamente por prueba y error:

  • Primero conviértase a iso-8859-1 usando Encode :: encode.
  • A continuación, convierta las citas de lujo (utilizando las 4 expresiones regulares mencionadas anteriormente).
  • Luego convierta la cadena a UTF-8 usando Encode :: encode (la necesitaba porque estaba usando la cadena en una aplicación iOS y la leí desde una base de datos SQLite usando "NSString stringWithUTF8String:" - puede no ser relevante para usted)

Espero que esto ayude a alguien.

+0

¿Exactamente qué 4 expresiones mencionadas anteriormente? –

Cuestiones relacionadas