2009-03-31 11 views
13

Tengo una aplicación escrita en C# que hace una gran cantidad de comparación de cadenas. Las cadenas se extraen de una variedad de fuentes (incluida la entrada del usuario) y luego se comparan. Sin embargo, estoy teniendo problemas cuando comparo el espacio '32' con el espacio sin interrupción '160'. Para el usuario, se ven iguales y esperan una coincidencia. Pero cuando la aplicación hace la comparación, no hay coincidencia.Comparación de cadenas, .NET y espacio sin interrupciones

¿Cuál es la mejor manera de hacerlo? ¿Voy a tener que ir a todas las partes del código que hacen una comparación de cadenas y normalizar manualmente los espacios sin interrupción a los espacios? ¿.NET ofrece algo para ayudar con eso? (He probado todas las opciones de comparación, pero ninguna parece ayudar.)

Se ha sugerido que normalice las cadenas al recibirlas y luego permita que el método de comparación de cadenas simplemente compare las cadenas normalizadas. No estoy seguro de que sea sencillo hacerlo porque, en primer lugar, lo que es una cadena normalizada. ¿Qué es lo que normalizo también? Claro, por ahora puedo convertir espacios sin rupturas en espacios abiertos. Pero, ¿qué más puede aparecer? ¿Puede haber potencialmente muchas de estas reglas? Podrían incluso estar en conflicto. (En un caso quiero usar una regla y en otro no).

+0

Aquí puede editar su propia pregunta para añadir más información o aclarar. –

Respuesta

9

Si fuera yo, 'normalizaría' las cadenas cuando las 'saqué'; probablemente con una cadena. Reemplazar(). Entonces no necesitará cambiar sus comparaciones en ningún otro lado.

Editar: Mark, eso es difícil. Depende realmente de usted, o de sus clientes, en cuanto a qué es una cadena 'normalizada'. He estado en una situación similar donde el cliente exigió cadenas como:

 
I have 4 apples. 
I have four apples. 

eran realmente iguales. Es posible que necesite normalizadores por separado para diferentes situaciones. De cualquier manera, yo seguiría haciendo la normalización al recuperar las cuerdas originales.

+0

Haría el smame. –

+0

Sí, yo normalizaría las cadenas a lo que a usted le importa con su propia función que llama a cadena. Reemplace y luego hace la comparación. – NoahD

+0

chicos, ¿cómo publico una pregunta de seguimiento o una pregunta de aclaración a esta respuesta propuesta? ¿Lo hago aquí? Esto solo permite 255 caracteres – Mark

29

Sufrí mucho dolor para encontrar esta sencilla respuesta. El siguiente código usa una expresión regular para reemplazar espacios que no se rompen con espacios normales.

string cellText = "String with non breaking spaces."; 
cellText = Regex.Replace(cellText, @"\u00A0", " "); 

Espero que esto ayude, Dan

+10

¿No @ impide que el carácter de escape funcione? ¿No debería ser cellText.Replace ("\ u00A0", "")? – jpmcclung

+8

@jpmcclung sí. Consulte "Objetos Char y Caracteres Unicode" en http://msdn.microsoft.com/en-us/library/system.string.aspx. FWIW, 'cellText.Reemplazar ('\ u00A0', '') 'es aún más rápido (http://www.dotnetperls.com/replace-performance) – Arithmomaniac

+2

FYI - cellText.Replace (@" \ u00A0 "," ") no funcionó. Regex.Replace (cellText, @ "\ u00A0", ""); parece ser el camino a seguir. – gpmurthy

1

me gustaría sugerir la creación de su propia comparador cadena que se extiende uno de los originales - hacer la "normalización" allí (reemplazar el espacio de no separación con el espacio regular) . Además del método de instancia Equals, hay un String.Equals estático que toma un comparador.

0

El mismo sin expresiones regulares, sobre todo para mí mismo cuando la necesite más adelante:

text.Replace(' ', '\u00A0')

Cuestiones relacionadas