Java regex para soporte Unicode?

3 minutos de lectura

Java regex para soporte Unicode?
cometa

Para hacer coincidir la A con la Z, usaremos expresiones regulares:

[A-Za-z]

¿Cómo permitir que la expresión regular coincida con los caracteres utf8 ingresados ​​por el usuario? Por ejemplo, palabras chinas como 环保部

  • En Java 7, Unicode regex es compatible con UNICODE_CHARACTER_CLASS bandera o empotrable (?U). Ver stackoverflow.com/questions/4304928/…

    -Alastair McCormack

    29 mar. 16 a las 17:33

Java regex para soporte Unicode?
tallo

Lo que está buscando son propiedades Unicode.

p.ej p{L} es cualquier tipo de letra de cualquier idioma

Entonces, una expresión regular para que coincida con una palabra china podría ser algo como

p{L}+

Hay muchas propiedades de este tipo, para más detalles ver expresiones-regulares.info

Otra opción es usar el modificador

Pattern.UNICODE_CHARACTER_CLASS

En Java 7 hay una nueva propiedad. Pattern.UNICODE_CHARACTER_CLASS que habilita la versión Unicode de las clases de caracteres predefinidas, vea mi respuesta aquí para obtener más detalles y enlaces

Podrías hacer algo como esto

Pattern p = Pattern.compile("\w+", Pattern.UNICODE_CHARACTER_CLASS);

y w coincidiría con todas las letras y todos los dígitos de cualquier idioma (y, por supuesto, algunas palabras que combinan caracteres como _).

  • Para hacer coincidir palabras como Da̱nx̱a̱laga̱litła̱n, ¿necesitamos indicar al comparador de patrones que combine los signos diacríticos?

    – Dave Jarvis

    17 dic. 2020 a las 06:25

Para abordar el soporte de NLS y evitar aceptar caracteres especiales en inglés, podemos usar el siguiente patrón…

[a-zA-Z0-9 u0080-u9fff]*+

Para referencia de punto de código UTF: http://www.utf8-chartable.de/unicode-utf8-table.pl

Fragmento de código:

    String vowels = "అఆఇఈఉఊఋఌఎఏఐఒఓఔౠౡ";
    String consonants = "కఖగఘఙచఛజఝఞటఠడఢణతథదధనపఫబభమయరఱలళవశషసహ";
    String signsAndPunctuations = "కఁకంకఃకాకికీకుకూకృకౄకెకేకైకొకోకౌక్కౕకౖ";
    String symbolsAndNumerals = "౦౧౨౩౪౫౬౭౮౯";
    String engChinesStr = "ABC導字會";


    Pattern ALPHANUMERIC_AND_SPACE_PATTERN_TELUGU = Pattern
            .compile("[a-zA-Z0-9 \u0c00-\u0c7f]*+");
    System.out.println(ALPHANUMERIC_AND_SPACE_PATTERN_TELUGU.matcher(vowels)
            .matches());


    Pattern ALPHANUMERIC_AND_SPACE_PATTERN_CHINESE = Pattern
            .compile("[a-zA-Z0-9 \u4e00-\u9fff]*+");

    Pattern ENGLISH_ALPHANUMERIC_SPACE_AND_NLS_PATTERN = Pattern
            .compile("[a-zA-Z0-9 \u0080-\u9fff]*+");

    System.out.println(ENGLISH_ALPHANUMERIC_SPACE_AND_NLS_PATTERN.matcher(engChinesStr)
            .matches());

Para hacer coincidir caracteres individuales, simplemente puede incluirlos en una clase de caracteres, ya sea como literales o a través de la u03FB sintaxis.

Obviamente, a menudo no puede enumerar todos los caracteres permitidos en los idiomas ideográficos. Para hacer que la expresión regular trate los caracteres Unicode según su tipo o bloque de código, se admiten varios otros escapes que se definen aquí. Mire la sección “Soporte Unicode”, particularmente las referencias a la Character clase y al propio estándar Unicode.

  • cómo combinar varios caracteres utf8 ingresados ​​por el ejemplo del usuario 环保部, porque el usuario ingresará una cantidad aleatoria de caracteres

    – cometa

    05 jun.

  • Es como hacer coincidir varios caracteres latinos: [a-z]+ o [a-z]{3} o incluso [a-z]{2,10}. Lo único diferente es lo que permite en la clase de caracteres a la que se aplica el cuantificador.

    – Kilian Foth

    05 jun.

  • la API de expresiones regulares de Java funciona en el char escribe
  • el char el tipo es implícitamente UTF-16
  • si tiene datos UTF-8, deberá transcodificarlos a UTF-16 en la entrada si aún no se ha hecho

Unicode es el conjunto universal de caracteres y UTF-8 puede describirlo todo (incluidos los caracteres de control, la puntuación, los símbolos, las letras, etc.). Deberá ser más específico sobre lo que desea incluir y lo que desea excluir. Las expresiones regulares de Java utilizan el p{category} sintaxis para hacer coincidir los puntos de código por categoría. Ver el estándar Unicode Para el lista de categorías.

Si desea identificar y separar palabras en una secuencia de ideogramas, deberá buscar una API más sofisticada. yo empezaria con el BreakIterator escribe.

.

¿Ha sido útil esta solución?