2011-05-16 209 views
6

Me gustaría realizar una sustitución insensible al acento en una cadena. Quiero que 'cliente' coincida con 'cliënt' y viceversa.C# Cómo reemplazar una cadena insensible a los acentos con regex?

Mi código es el siguiente:

Regex reg = new Regex("client"); 
string result = reg.Replace("here goes the content with client and cliënt", "replacementWith"); 

Entonces, ¿cómo asegurarse de que 'cliente' coincidencias 'cliente' y 'cliente' y viceversa?

Respuesta

3

se puede incluir en la expresión regular

Regex reg = new Regex("cli[eë]nt"); // will match both 'client' and 'cliënt' 

o puede eliminar todos los acentos en la cadena y luego aplicar la expresión regular.

string test = "here góes the cóntent with client and cliënt"; 

char[] replacement = { 'a','a','a','a','a','a','c','e','e','e','e','i','i','i','i','n','o','o','o','o','o','u','u','u','u','y','y' }; 
char[] accents = { 'à','á','â','ã','ä','å','ç','é','è','ê','ë','ì','í','î','ï','ñ','ò','ó','ô','ö','õ','ù','ú','û','ü','ý','ÿ' }; 


for (int i = 0; i < accents.Length; i++) 
{ 
    test = test.Replace(accents[i], replacement[i]); 
} 

Esto no es muy eficiente, pero hará el trabajo para pequeñas cantidades de texto.

+0

Asegúrese de ejecutar su cadena a través de un [Proceso de normalización Unicode] (http://www.regular-expressions.info/unicode.html) antes de quitar los acentos, sin embargo. – ladenedge

+0

Lo siento, creo que no fui lo suficientemente claro. El cliente fue solo un ejemplo. Quiero una manera general de reemplazar las cadenas insensibles a los acentos. – Martijn

+1

Gracias, pero desafortunadamente tengo que lidiar con documentos. Entonces, un documento puede ser pequeño, pero también puede ser muy grande. Consideraré usar este enfoque. – Martijn

0

Have a look at this page

tener en cuenta que es necesario trabajar en una cultura específica, aunque - no hay cultura acento sustitución arbitraria, ya que en una cultura E y E podría considerarse equivalente, en otro que podría ser diferente.

+0

He modificado mi expresión regular con 'Regex reg = new Regex (" cliente ", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);' pero no he especificado mi cultura. ¿Es esto necesariamente? ¿O busco una cultura donde 'e' y' ë' signifiquen lo mismo ..: p – Martijn

+0

Lo sentimos, en más lecturas, no parece que CultureInvariant sea suficiente. Puedo decirte cómo hacer las comparaciones apropiadas sin acento con las opciones 'CompareInfo' y' IgnoreNonSpace', pero no usando Regexs :( –

+0

No importa, aunque Thnx por el esfuerzo :) – Martijn

Cuestiones relacionadas