2011-03-16 13 views
10

Estoy desarrollando un software portugués, por lo que muchas de mis entidades tienen nombres como 'maça' o 'lição' y quiero usar la entidad como clave de recursos. Así que quiero mantener todos los caracteres, excepto el 'ç, ã, õ ....'Eliminar todos los caracteres latinos exclusivos utilizando regex

¿Existe alguna solución óptima para usar regex? Mi expresión regular es real (como sugieren Remove characters using Regex):

Regex regex = new Regex(@"[\W_]+"); 
string cleanText = regex.Replace(messyText, "").ToUpper(); 

más que destacar, estoy preocupado solo con caracteres latinos.

+1

El título dice "eliminar todos los caracteres latinos", ¿es correcto? ¿Qué pasa con '" abçã12 # $% "'? – Kobi

+0

¿Qué pasa con "abc", todos los caracteres latinos. – Tergiver

+0

my malo @Kobi, cambié el título – Custodio

Respuesta

7

Una opción sencilla es la lista blanca de los caracteres aceptados:

string clean = Regex.Replace(messy, @"[^[email protected]#]+", ""); 

Si desea eliminar todas las cartas que no son ASCII, pero mantener el resto de caracteres, que puede utilizar character class subtraction:

string clean = Regex.Replace(messy, @"[\p{L}-[a-zA-Z]]+", ""); 

También se puede escribir como el más estándar y complicado [^\P{L}a-zA-Z]+ (o [^\Wa-zA-Z]), que dice "seleccionar todos los caracteres que son no (no letras de letras o letras ASCII) ", que termina con las letras que estamos buscando.

También puede considerar el siguiente enfoque más útil: How do I remove diacritics (accents) from a string in .NET?

+0

+1 porque nunca antes había visto la resta de clases de caracteres. Santo cielo, eso es útil. ¿Esto solo está en .NET? –

+0

Esto es lo que estoy pensando @Kobi. La idea de todos los personajes menos el exclusivo latino. – Custodio

+0

@Justin - ¡Gracias! No es .Net solamente (lo he visto en otro lado, IIRC, aunque no puedo hacerlo funcionar en ningún momento en este momento, así que me puedo equivocar aquí), y no es tan útil en absoluto, esto Es la primera vez que considero usarlo. Probablemente podrías escribirlo de otra manera con una alternancia, o algo así como '(?! [A-zA-z]) \ p {L}' (Probablemente me pierda la opción obvia aquí ...) – Kobi

4

¿Funciona?

Regex regex = new Regex(@"[^a-zA-Z0-9_]"); 
+0

Golpeado :) –

4

Otra opción podría ser la de convertir de Unicode a ASCII. Esto no soltará los caracteres, sino que los convertirá en '?' S. Eso podría ser mejor que dejarlos caer (para usarlos como teclas).

string suspect = "lição"; 
byte[] suspectBytes = Encoding.Convert(Encoding.Unicode, Encoding.ASCII, Encoding.Unicode.GetBytes(suspect)); 
string purged = Encoding.ASCII.GetString(suspectBytes); 
Console.WriteLine(purged); // li??o 

Tenga en cuenta que los signos de interrogación a menudo son únicos pero no representan caracteres, por lo que puede obtener menos colisiones.

1

Creo que la mejor expresión regular sería utilizar:

[^\x00-\x80] 

Esta es la negación de todos los caracteres ASCII. Coincide con todos los caracteres que no sean ASCII: \x00 y \x80 (128) es el código de carácter hexadecimal, y - significa rango. El ^ dentro de [ y ] significa negación.

Reemplácelos con la cadena vacía, y debe tener lo que desea. También le libera de preocuparse por la puntuación, y cosas por el estilo, que no son ASCII y pueden causar errores sutiles pero molestos (y difíciles de localizar).

Si desea utilizar el conjunto extendido ASCII como caracteres legales, puede decir \xFF en lugar de \x80.

+0

, simplemente agregue el carácter de espacio y esto funciona bien. – Custodio

+0

Pero tratando de mantener el código legible como sea posible, el x00 y el x80 pueden ser un punto de temor para el mantenimiento futuro. – Custodio

+0

@ Luís - Considere agregar un comentario amigable, en ese caso, con un enlace aquí ':)' – Kobi

2

El objetivo debe ser simplemente incluir los caracteres ASCII A-Z y los números y signos de puntuación. Solo excluya todo lo que esté fuera de ese rango usando RegEx.

string clean = Regex.Replace(messy, @"[^\x20-\x7e]", String.Empty); 

Para ser claros, la expresión regular que estoy usando es:

[^\x20-\x7e] 

Es posible que necesite escapar el carácter \ - No he probado esto en otra cosa que RegEx compañero :)

Eso excluye todo lo que esté fuera de los caracteres ASCII 0x20 y 0x7e, lo que se traduce en un rango ASCII decimal 32-127.

¡Buena suerte!

mejor,

-Auri

0

Esto es más útil para mí:

([\p{L}]+) 
Cuestiones relacionadas