test regulares regular probar online expresiones expresion espacio ejemplos blanco alfanumerico regex unicode flex-lexer non-english

regulares - javascript regex test



Use expresiones regulares para hacer coincidir CUALQUIER carácter chino en la codificación utf-8 (4)

Por ejemplo, quiero hacer coincidir una cadena que consta de m con 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?


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

Recomendación

Para combinar patrones con caracteres chinos y otros puntos de código Unicode con un analizador léxico compatible con Flex, puede utilizar el analizador léxico RE / flex para C ++ que es compatible con Flex con versiones anteriores. RE / flex es compatible con Unicode y trabaja con Bison para construir lexers y analizadores.

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

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

Utilice la %option unicode global %option unicode para habilitar Unicode. También puede usar un modificador local (?u:) para restringir Unicode a un solo patrón (por lo que todo lo demás sigue siendo ASCII / 8 bits 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]); } %%

La opción flex habilita la compatibilidad con Flex, por lo que puede usar yytext , yyleng , ECHO , etc. Sin la opción flex , RE / flex espera las llamadas al método Lexer: text() (o str() y wstr() para std::string y std::wstring ), size() (o wsize() para longitud de caracteres amplia), y echo() . Las llamadas al método RE / flex son IMHO más limpias, e incluyen operaciones de char amplia.

Fondo

En el antiguo Flex simple, terminé definiendo patrones UTF-8 feos para capturar letras ASCII y letras codificadas UTF-8 para un proyecto de compilador que requería soporte para identificadores Unicode id :

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, guiones bajos y puntos de código Unicode que se utilizan 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 se intercambia la compacidad por cierta falta de precisión y para permitir caracteres UTF-8 demasiado largos en algunos casos que no son válidos UTF-8. Si está pensando en este enfoque, tenga cuidado con los problemas y preocupaciones de seguridad. En su lugar, use un generador de escáner compatible con Unicode, como RE / flex .

La seguridad

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

  1. La codificación de sus propios patrones UTF-8 en Flex para que coincidan con cualquier carácter de Unicode puede ser propensa a errores. Los patrones deben estar restringidos a los 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 los pares sustitutos UTF-16 y son puntos de código no válidos . Cuando utilice una herramienta para convertir un rango Unicode a UTF-8, asegúrese de excluir puntos de código no válidos.

  2. Los patrones deben rechazar secuencias de bytes demasiado largas y otras inválidas . El UTF-8 no válido no debe ser aceptado en silencio.

  3. Para detectar errores de entrada léxica en su lexer necesitará un especial . (punto) que coincida con Unicode válido e inválido, incluidos los desbordamientos de UTF-8 y las secuencias de bytes no válidas, para generar un mensaje de error que indica que la entrada se rechaza. Si usa el punto como un "catch-all-else" para generar un mensaje de error, pero su punto no coincide con Unicode no válido, entonces el lexer se bloqueará ("el escáner está atascado") o su lexer tendrá caracteres de basura ECHO en la salida. por la "regla por defecto" de Flex.

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

  5. Como 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 las codificaciones UTF no válidas en la guía del usuario de RE / flex.


En Java 7 y versiones posteriores, el formato debe ser: "/ p {IsHan}"


En java

/p{InCJK_UNIFIED_IDEOGRAPHS}{1,3}