Pregunta

Hay muchas preguntas y respuestas aquí en stackoverflow que suponen que una "carta" se puede igualar en una regexp por [a-zA-Z]. Sin embargo, con Unicode hay muchos más personajes que la mayoría de la gente consideraría una letra (todas las letras griegas, Cyrllic ... y muchos más. Unicode define muchos bloques cada uno de los cuales puede tener "letras".

La definición de Java Define las clases de Posix Para cosas como los personajes alfa, pero eso se especifica para trabajar solo con US-ASCII. Las clases de caracteres predefinidas definen las palabras que consisten en [a-zA-Z_0-9], que también excluye muchas letras.

Entonces, ¿cómo coincide adecuadamente con las cadenas Unicode? ¿Hay alguna otra biblioteca que lo haga bien?

¿Fue útil?

Solución

Aquí tienes una muy buena explicación:

http://www.regular-expressions.info/unicode.html

Algunas pistas:

"Java y .net desafortunadamente no admiten \X (aún). Usar \P{M}\p{M}* como sustituto. Para que coincida con cualquier número de grafemas, use (?:\P{M}\p{M}*)+ en vez de \X+."

"En Java, el token regex \uFFFF Solo coincide con el punto de código especificado, incluso cuando activó la equivalencia canónica. Sin embargo, la misma sintaxis \uFFFF También se usa para insertar caracteres Unicode en cadenas literal en el código fuente de Java. Pattern.compile("\u00E0") coincidirá con las codificaciones de punto de código único y de doble código de à, tiempo Pattern.compile("\\u00E0") coincide solo con la versión de punto único. Recuerde que al escribir una regex como una cadena de java literal, se deben escaparse de barras de retroceso. El antiguo código Java compila el regex à, mientras que este último se compila \u00E0. Dependiendo de lo que esté haciendo, la diferencia puede ser significativa ".

Otros consejos

¿Estás hablando de categorías de Unicode, como letras? Estos coinciden con una regla del formulario \p{CAT}, donde "gato" es el código de categoría como L para cualquier carta, o una subcategoría como Lu para mayúsculas o Lt para el caso del título.

Citado del Javadoc de java.util.regex.pattern.

Soporte de unicode

Esta clase está en conformidad con el Nivel 1 del Estándar Técnico de Unicode #18: Pautas de expresión regulares de unicode, más RL2.1 equivalentes canónicos.

Las secuencias de escape de unicode como u2014 en el código fuente de Java se procesan como se describe en §3.3 de la especificación del idioma Java. Dichas secuencias de escape también son implementadas directamente por el analizador de expresión regular para que se puedan usar escapes Unicode en expresiones que se leen de archivos o del teclado. Por lo tanto, las cadenas " u2014" y " u2014", aunque no son iguales, se compilan en el mismo patrón, que coincide con el personaje con el valor hexadecimal 0x2014.

Los bloques y categorías Unicode se escriben con las construcciones P y P como en Perl. P {PROP} coincide si la entrada tiene la propiedad Prop, mientras que P {PROP} no coincide si la entrada tiene esa propiedad. Los bloques se especifican con el prefijo en, como en Inmongolian. Las categorías pueden especificarse con el prefijo opcional es: tanto p {l} como p {isl} denota la categoría de letras unicode. Los bloques y categorías se pueden usar tanto dentro como fuera de una clase de caracteres.

Las categorías compatibles son las del estándar Unicode en la versión especificada por la clase de caracteres. Los nombres de la categoría son los definidos en el estándar, tanto normativo como informativo. Los nombres de bloques compatibles con el patrón son los nombres de bloque válidos aceptados y definidos por unicodeBlock.forname.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top