2011-07-12 122 views
7

Necesito un Regex en un programa C#.Regex insensible a los acentos?

Tengo que capturar el nombre de un archivo con una estructura específica.

Usé la clase \ w char, pero el problema es que esta clase no coincide con ningún carácter acentuado.

Entonces, ¿cómo hacer esto? Simplemente no quiero poner la letra acentuada más usada en mi patrón porque teóricamente puedo poner cada acento en cada letra.

Así que pensé que tal vez hay una sintaxis, para decir que queremos un caso insensible (o una clase que tenga en cuenta el acento), o una opción "Regex" que me permita ser insensible a mayúsculas y minúsculas.

¿Sabes algo como esto?

Muchas gracias

+0

procedimientos no emparejado –

+0

Por favor, intente. debería: Coincide con cualquier carácter, excepto un carácter de nueva línea – MrFox

+2

¿Puede mostrarnos qué ha intentado * en el código *? –

Respuesta

4

Case-insensite funciona para mí en este ejemplo:

 string input [email protected]"âãäåæçèéêëìíîïðñòóôõøùúûüýþÿı"; 
    string pattern = @"\w+"; 
    MatchCollection matches = Regex.Matches (input, pattern, RegexOptions.IgnoreCase); 
+0

Coincide con toda la cadena. –

+0

Sí, lo siento, utilicé RegexOptions.CultureInvariant, porque necesito que sea sensible a mayúsculas y minúsculas :) – J4N

0

No me derribar para esto, pero si sólo está tratando de coincidir con un nombre de archivo, entonces por qué no ir a otro lado y utilizar caracteres excluidos?

[^<>:"/\|?*] 
1

Prueba esto:

String pattern = @"[\p{L}\w]+"; 
-2

¿Usted intentó. debería: Coincide con cualquier carácter individual excepto un carácter de nueva línea. \ w: Coincide con cualquier carácter de palabra, incluido el subrayado. Equivalente a "[A-Za-z0-9_]". Por lo tanto, tiene sentido que se excluyan las letras acentuadas.

http://www.mikesdotnetting.com/Article/46/CSharp-Regular-Expressions-Cheat-Sheet

+0

Usted se contradice a sí mismo. Me refiero a que dices: '\ w' coincide con cualquier palabra y es equivalente a' [A-Za-z0-9_] ' –

0

¿Se puede probar esto y ver si funciona:

[\u00E9-\u00F8\w] 
2

Utilice esta \p{L} en lugar de la del clase \w

\p{L} es un punto de código Unicode con la categoría "carta". Por lo tanto, incluye, por ejemplo, "äöüéè", etc.

También puede usarlo en su propia clase de caracteres, si se quiere, por ejemplo, incluye el espacio o el punto como esto [\p{L} .]

Actualización:

OK, reconocí que \w en .NET también incluye las letras Unicode y no solo las ASCII.

Así que no estoy seguro de lo que está preguntando. Si desea permitir cosas que solo parecen una letra, pero no lo es, entonces creo que terminará usando \S (no un espacio en blanco).

Tal vez sea útil si muestras algunos ejemplos.

11

Simplemente puede reemplazar signos diacríticos con equivalencias alfabéticas (cercanas), y luego usar usar su expresión regular actual.

Ver por ejemplo: caracteres acentuados

How do I remove diacritics (accents) from a string in .NET?

static string RemoveDiacritics(string input) 
{ 
    string normalized = input.Normalize(NormalizationForm.FormD); 
    var builder = new StringBuilder(); 

    foreach (char ch in normalized) 
    { 
     if (CharUnicodeInfo.GetUnicodeCategory(ch) != UnicodeCategory.NonSpacingMark) 
     { 
      builder.Append(ch); 
     } 
    } 

    return builder.ToString().Normalize(NormalizationForm.FormC); 
} 

string s1 = "Renato Núñez David DeJesús Edwin Encarnación"; 
string s2 = RemoveDiacritics(s1); 
// s2 = "Renato Nunez David DeJesus Edwin Encarnacion" 
+0

de hecho, cometí un error, la expresión regular no estaba tomando mi palabra acentuada, pero no fue por la acento, pero debido a un "-". Lo siento mucho por la vez que te hago perder. "\ w" en realidad funciona – J4N

Cuestiones relacionadas