vacio solo regulares regular nombre letras expresiones expresion especiales espacios espacio ejemplos cualquier caracteres caracter blanco apellidos alfanumerico acentos regex perl

regex - solo - expresion regular vacio



¿Cómo puedo cambiar los caracteres latinos extendidos a sus equivalentes ASCII sin acentos? (5)

Cuando me gustaría traducir algo de cadena, no solo caracteres, estoy usando este enfoque:

my %trans = ( ''é'' => ''e'', ''ê'' => ''e'', ''á'' => ''a'', ''ç'' => ''c'', ''Ď'' => ''D'', map +($_=>''''), qw(‡ Ω ‰) }; my $re = qr/${ /(join''|'', map quotemeta, keys %trans)}/; s/($re)/$trans{$1}/ge;

Si quieres algo más complicado, puedes usar funciones en lugar de constantes de cadena. Con este enfoque, puedes hacer lo que quieras. Pero para su caso, tr debe ser más efectivo:

tr/éêáçĎ/eeacD/; tr/‡Ω‰//d;

Necesito una transcripción genérica o una expresión regular de sustitución que mapeará caracteres latinos extendidos a caracteres ASCII de aspecto similar, y todos los demás caracteres extendidos a '''' (cadena vacía) para que ...

  • é se vuelve e

  • ê se convierte en e

  • á se convierte en

  • ç se convierte en c

  • Ď se convierte en D

y así sucesivamente, pero cosas como ‡ o Ω o ‰ simplemente se rayan.


Tal vez un módulo CPAN podría ser de ayuda?

Text :: Unidecode parece prometedor, aunque no tira ‡ o Ω o ‰. Más bien, estos son reemplazados por ++, O y% o. Esto podría o no ser lo que quieres.

Text :: Unaccent , es otro candidato, pero solo para deshacerse de los acentos.


Use Unicode :: Normalize para obtener el NFD ($ str). De esta forma, todos los caracteres con signos diacríticos se convertirán en un carácter base seguido de un carácter diacrítico de combinación. Luego, simplemente elimine todos los caracteres que no sean ASCII.


Texto :: Unaccent o alternativamente Text :: Unaccent :: PurePerl suena como lo que está pidiendo, al menos la primera mitad.

$unaccented = unac_string($charset, $string);

Eliminar todos los caracteres que no sean ASCII sería relativamente simple.

s/[^/000-/177]+//g;


Todas las respuestas brillantes Pero ninguno realmente funcionó. Colocar caracteres extendidos directamente en el código fuente causaba problemas cuando se trabajaba en ventanas de terminal o en varios editores de códigos y textos en todas las plataformas. Pude probar Unicode :: Normalize, Text :: Unidecode y Text :: Unaccent, pero no puedo hacer que ninguno de ellos haga exactamente lo que quiero.

Al final acabo de enumerar todos los caracteres que quería transcribir yo mismo para UTF-8 (que es la página de códigos más frecuente que se encuentra en mis datos de entrada).

Necesitaba dos sustituciones adicionales para ocuparme de æ y Æ, que quiero asignar a dos caracteres

Para las partes interesadas, el código final es: (el tr es una sola línea)

$word =~ tr//xC0/xC1/xC2/xC3/xC4/xC5/xC7/xC8/xC9/xCA/xCB/xCC/xCD/xCE/xCF /xD0/xD1/xD2/xD3/xD4/xD5/xD6/xD8/xD9/xDA/xDB/xDC/xDD/xE0/xE1/xE2/xE3/xE4 /xE5/xE7/xE8/xE9/xEA/xEB/xEC/xED/xEE/xEF/xF0/xF1/xF2/xF3/xF4/xF5/xF6/xF8 /xF9/xFA/xFB/xFC/xFD/xFF/AAAAAACEEEEIIIIDNOOOOOOUUUUYaaaaaaceeeeiiiionoo oooouuuuyy/; $word =~ s//xC6/AE/g; $word =~ s//xE6/ae/g; $word =~ s/[^/x00-/x7F]+//g;

Como cosas como Ď no son parte de UTF-8, no ocurren con tanta frecuencia en mis datos de entrada. Para la entrada que no es UTF-8, elegí simplemente perder todo por encima de 127.