2010-06-23 19 views
8

Estoy tratando de unir caracteres Unicode en Java.Cómo puedo unir caracteres Unicode en Java

entrada de cadena: informa

cadena para que coincida con: informátion

Hasta ahora me he probado esto:

Pattern p= Pattern.compile("informa[\u0000-\uffff].*", (Pattern.UNICODE_CASE|Pattern.CANON_EQ|Pattern.CASE_INSENSITIVE)); 
    String s = "informátion"; 
    Matcher m = p.matcher(s); 
    if(m.matches()){ 
     System.out.println("Match!"); 
    }else{ 
     System.out.println("No match"); 
    } 

sale como "No hay resultados". ¿Algunas ideas?

+2

¿Qué hay de intercambios de información los '? ¿Debería "coincidir"? – kennytm

+0

Sí, esa sería la idea. Por ahora, solo el á haría. – ankimal

Respuesta

12

El término "caracteres Unicode" no es lo suficientemente específico. Coincide con cada carácter que está en el rango Unicode, por lo tanto también caracteres "normales". Sin embargo, este término se usa muy a menudo cuando uno en realidad significa "caracteres que no están en el printable ASCII range".

En términos regex que serían [^\x20-\x7E].

boolean containsNonPrintableASCIIChars = string.matches(".*[^\\x20-\\x7E].*"); 

Dependiendo de lo que desea hacer con esta información, he aquí algunas respuestas de seguimiento útiles:

+0

El java.text.Normalizer parece ser la forma de ve (viñeta 2). La coincidencia Unicode simplemente no parece funcionar como se esperaba y podría recibir una penalización de rendimiento incluso si lo hiciera. – ankimal

+0

Si su requisito funcional * real * es "deshacerse de las marcas diacríticas", entonces, de hecho, es el camino a seguir. Tu pregunta inicial no fue formulada de esa manera :) – BalusC

+0

Creo que la pregunta no fue clara. El objetivo era poder hacer coincidir "información" con "información", por lo tanto, la capacidad de unir "a" con cualquier forma de "á", "å", etc. Eliminar las marcas diacríticas y luego hacer coincidir parece ser el camino ir. – ankimal

6

¿Es porque informa no es una subcadena de informátion en absoluto?

¿Cómo funcionaría su código si eliminara el último a de informa en su expresión regular?

+0

informa \ u0301 funciona en la cadena del patrón. Esto tiene que ver con el caso Pattern.CANON_EQ. – ankimal

+0

Se olvidó de poner en el enlace para esto, http://java.sun.com/docs/books/tutorial/essential/regex/pattern.html (Pattern.CANON_EQ) – ankimal

1

Suena como si desea unir letras sin tener en cuenta las marcas diacríticas. Si eso es correcto, normalice sus cadenas a formato NFD, elimine las marcas diacríticas y luego haga su búsqueda.

String normalized = java.text.Normalizer.normalize(textToSearch, java.text.Normalizer.Form.NFD); 
String withoutDiacritical = normalized.replaceAll("\\p{InCombiningDiacriticalMarks}+", ""); 
// Search code goes here... 

Para obtener más información sobre NFD:

Cuestiones relacionadas