Use la expresión regular para unir CUALQUIER carácter chino en la encoding utf-8

Por ejemplo, quiero hacer coincidir una cadena que consta de m a n caracteres chinos, luego puedo usar:

 [single Chinese character regular expression]{m,n} 

¿Hay alguna expresión regular de un solo carácter chino, que podría ser cualquier carácter chino que exista?

La expresión regular para que coincida con un personaje chino (bueno, CJK) es

 \p{script=Han} 

que se puede aprehender simplemente

 \p{Han} 

Esto supone que su comstackdor de expresiones regulares cumple con las propiedades del requisito RL1.2 de UTS # 18 expresiones regulares de Unicode . Perl y Java 7 cumplen con esa especificación, pero muchos otros no.

En Java,

 \p{InCJK_UNIFIED_IDEOGRAPHS}{1,3} 

¿Hay alguna expresión regular de un solo carácter chino, que podría ser cualquier carácter chino que exista?

Recomendación

Para unir patrones con caracteres chinos y otros puntos de código Unicode con un analizador léxico compatible con Flex, puede usar el analizador RE / flex léxico para C ++ que es compatible con Flex. RE / flex es compatible con Unicode y funciona con Bison para construir lexers y analizadores sintácticos.

Puede escribir patrones Unicode (y expresiones regulares UTF-8) en especificaciones RE / flex tales como:

 %option flex unicode %% [肖晗] { printf ("xiaohan/2\n"); } %% 

Utilice %option unicode global para habilitar Unicode. También puede usar un modificador local (?u:) para restringir Unicode a un patrón único (para que todo lo demás siga siendo ASCII / 8-bit como en Flex):

 %option flex %% (?u:[肖晗]) { printf ("xiaohan/2\n"); } (?u:\p{Han}) { printf ("Han character %s\n", yytext); } . { printf ("8-bit character %d\n", yytext[0]); } %% 

Option flex permite la compatibilidad Flex, por lo que puede usar yytext , yyleng , ECHO , etc. Sin la opción flex RE / flex espera llamadas al método Lexer: text() (o str() y wstr() para std::string y std::wstring ), size() (o wsize() para ancho de char), y echo() . Las llamadas a los métodos RE / flex son en mi humilde opinión más limpias e incluyen operaciones de charlas amplias.

Fondo

En el simple viejo Flex, terminé definiendo feos patrones UTF-8 para capturar letras ASCII y letras codificadas UTF-8 para un proyecto de comstackción que requería soporte para identificación de identificador Unicode:

 digit [0-9] alpha ([a-zA-Z_\xA8\xAA\xAD\xAF\xB2\xB5\xB7\xB8\xB9\xBA\xBC\xBD\xBE]|[\xC0-\xFF][\x80-\xBF]*|\\u([0-9a-fA-F]{4})) id ({alpha})({alpha}|{digit})* 

El patrón alpha admite letras ASCII, guión bajo y puntos de código Unicode que se usan en los identificadores ( \p{L} etc.). El patrón permite más puntos de código Unicode que los absolutamente necesarios para mantener el tamaño de este patrón manejable, por lo que cambia la compacidad por cierta falta de precisión y permite caracteres demasiado largos UTF-8 en algunos casos que no son UTF-8 válidos. Si está pensando en este enfoque, tenga cuidado con los problemas y preocupaciones de seguridad. Use un generador de escáner con capacidad Unicode en su lugar, como RE / flex .

La seguridad

Cuando se usa UTF-8 directamente en patrones Flex, hay varias preocupaciones:

  1. La encoding de sus propios patrones UTF-8 en Flex para hacer coincidir cualquier carácter Unicode puede ser propenso a errores. Los patrones deben estar restringidos a caracteres en el rango Unicode válido solamente. Los puntos de código Unicode cubren el rango U + 0000 a U + D7FF y U + E000 a U + 10FFFF. El rango U + D800 a U + DFFF está reservado para UTF-16 pares suplentes y son puntos de código no válidos . Al usar una herramienta para convertir un rango Unicode a UTF-8, asegúrese de excluir puntos de código no válidos.

  2. Los patrones deberían rechazar secuencias de bytes no válidas y otras no válidas . El UTF-8 no válido no debe ser aceptado en silencio.

  3. Para detectar errores de entrada léxica en su lexer requerirá un especial . (punto) que coincide con Unicode válido e inválido, incluidos los desbordamientos UTF-8 y las secuencias de bytes no válidas, para producir un mensaje de error que indica que la entrada es rechazada. Si usa punto como “catch-all-else” para producir un mensaje de error, pero su punto no coincide con Unicode no válido, entonces el lector se bloqueará (“el escáner está atascado”) o su lexer mostrará caracteres ECHO en la salida por la “regla predeterminada” de Flex.

  4. Su escáner debe reconocer una BOM UTF (Marca de Orden de Byte Unicode) en la entrada para cambiar a UTF-8, UTF-16 (LE o BE) o UTF-32 (LE o BE).

  5. Como usted señala, los patrones como [unicode characters] no funcionan en absoluto con Flex porque los caracteres UTF-8 en una lista de corchetes son caracteres multibyte y cada carácter de un solo byte puede coincidir, pero no el carácter UTF-8.

Consulte también codificaciones UTF no válidas en la guía de usuario de RE / flex.

En Java 7 y versiones superiores, el formato debería ser: “\ p {IsHan}”

    Intereting Posts