2011-10-28 8 views
5

tengo un pequeño problema aquí y he estado atrapado durante 2 días, así que si alguien puede ayudarme, estaré contento :). Tengo un enorme archivo de código con muchas líneas de la siguiente manera:Coincidencia de símbolos cirílicos en C#

Enterprise::TextMessageBox::Show(String::Format(S"Възникнал е проблем:\n\n{0}", e->Message), S"Грешка"); 

lo que estoy tratando de hacer es encontrar cada parte del código con cadena de símbolos cyrilic con otro texto que proporciono. Mi problema es que no puedo hacer expresiones suficientemente buenas para poder tomar las líneas. Otro problema es que algunas veces las líneas contienen solo una de tales cadenas pero otras veces contienen 2 o más en una línea.

Cada una de estas cuerdas es similar y se vea así:

S"some cyrilic symbols" 

traté de hacerlo con la clase de expresiones regulares, pero no puedo parecen hacer buen patrón suficiente para las cuerdas.

¡Gracias por toda su ayuda con anticipación!

+0

Esto es C++/CLI no C# – Polity

+0

Amigo no me diga cuál es mi programa ... las cadenas que estoy buscando son de C++ administrado en realidad pero estoy escribiendo la aplicación para hacer la tarea que necesito en C# así que por favor ¡no cambies mis etiquetas! – Jordan

+0

¿Está intentando guiar esto o usar el cuadro de diálogo Buscar en archivos para obtener una lista de las apariciones en el código? En cualquier caso, ¿cuál es el problema si hay dos instancias en la misma línea? – sq33G

Respuesta

8

OK tiene la posibilidad de hacer coincidir las propiedades Unicode.Intentar algo como esto

Regex TheRegex = new Regex(@"S""[\p{IsCyrillic}\p{P}\p{N}\s]*"""); 

\p{IsCyrillic} coincide con cualquier carácter cirílico

\p{P} es la categoría Unicode para puntuacion

\p{N} es la categoría Unicode para un número en cualquier idioma

\s coincide con un espacio en blanco

See here on msdn para obtener más información sobre las categorías Unicode y aquí en regular-expressions.info.

0

Puede intentar abrir su archivo de una de estas tres maneras, depende de cómo fue guardado, pero para mí la regla es que string es unicode, por lo que esta lectura codifica caracteres nativos para unicode, y luego Regex debería funcionar .

/* Open OEM File*/ 
FileStream f1 = new FileStream(@"..\..\Datas\TestOEM.txt",FileMode.Open); 
StreamReader sw1 = new StreamReader(f1, 
    Encoding.GetEncoding(CultureInfo.CurrentCulture.TextInfo.OEMCodePage)); 
string a = sw1.ReadLine(); 
Console.WriteLine(a); 
sw1.Close(); 
f1.Close(); 

    /* Open Unicode file */ 
FileStream f2 = new FileStream(@"..\..\Datas\TestUNICODE.txt",FileMode.Open); 
StreamReader sw2 = new StreamReader(f2,Encoding.Unicode); 
string b = sw2.ReadLine(); 
Console.WriteLine(b); 
sw2.Close(); 
f2.Close(); 
    /* Open ANSI file */ 

FileStream f3 = new FileStream(@"..\..\Datas\TestANSI.txt",FileMode.Open); 
StreamReader sw3 = new StreamReader(f3,Encoding.Default); 
string c = sw3.ReadLine(); 
Console.WriteLine(c); 
sw3.Close(); 
f3.Close(); 

Puede bucle y utilizar expresiones regulares

Regex reg0 = new Regex(@"Възникнал е проблем", 
         RegexOptions.Compiled | RegexOptions.IgnoreCase); 
if (reg0.IsMatch(string from file)){...} 
0

Prueba esta expresión regular: -

Match match = Regex.Match(input, @"YourReplacementText", 
    RegexOptions.Multiline | RegexOptions.IgnoreCase); 

// Here we check the Match instance. 
if (match.Success) 
{ 
    // Do your stuff 
} 

entrada - este es su cadena de entrada cyrilic

YourReplacementText - esta es su cadena de reemplazo cirílico

RegexOptions.Multiline | RegexOptions.IgnoreCase - representa esta expresión regular, ignora el caso y también busca multilínea.

notación corta para Regexp:

/Грешка/gim 

Грешка - cambiar este texto para el texto que desee para el reemplazo/juego finalidad

i - ignorecase representa

m - representa multiline

g - representa global, para la coincidencia iterativa

+0

Falta el punto principal, el OP desea emparejar cadenas con CUALQUIER letra cirílica y no con una palabra específica. – stema