Correspondance (par exemple) d'une lettre Unicode avec des expressions rationnelles Java
Il y a beaucoup de questions et de réponses ici, sur StackOverflow qui supposent une "lettre" peut être mis en correspondance dans une regexp par [a-zA-Z]
. Cependant, avec Unicode il y a beaucoup plus de caractères que la plupart des gens considéreraient comme une lettre (toutes les lettres grecques, Cyrllic .. et beaucoup plus. Unicode définit le nombre de blocs qui peuvent avoir des "lettres".
La Java définition définit Posix classes pour des choses comme les caractères alpha, mais qui est spécifié pour fonctionner uniquement avec de l'US-ASCII. Les classes de caractères prédéfinies définir les mots qui se composent de [a-zA-Z_0-9]
ce qui exclut également de nombreuses lettres.
Alors, comment pouvez-vous bien les match contre les chaînes Unicode? Est-il un autre bibliothèque qui obtient ce droit?
source d'informationauteur The Archetypal Paul
Vous devez vous connecter pour publier un commentaire.
Ici vous avez une très belle explication:
http://www.regular-expressions.info/unicode.html
Quelques conseils:
"Java et .NET, malheureusement, ne prennent pas en charge
\X
(encore). Utilisation\P{M}\p{M}*
comme un substitut. Pour correspondre à n'importe quel nombre de graphèmes, l'utilisation(?:\P{M}\p{M}*)+
au lieu de\X+
.""En Java, la regex jeton
\uFFFF
seulement correspond au code point, même lorsque vous avez activé canonique de l'équivalence. Cependant, la même syntaxe\uFFFF
est également utilisé pour insérer des caractères Unicode dans les chaînes littérales dans le code source Java.Pattern.compile("\u00E0")
va correspondre à la fois à l'unique point de code et double-code-point de codages deà
tandis quePattern.compile("\\u00E0")
correspond seulement au seul point de code de la version. Rappelez-vous que lors de l'écriture d'une expression régulière comme Java littéral de chaîne, les barres obliques inverses doivent être échappés. L'ancien code Java compile les regexà
tandis que la seconde compile\u00E0
. En fonction de ce que vous faites, la différence peut être importante."Tu parles Unicode catégories, comme les lettres? Ces sont compensées par une expression rationnelle de la forme
\p{CAT}
où le "CHAT" est le code de la catégorie commeL
pour toute lettre, ou une sous-catégorie, commeLu
pour la majuscule ouLt
pour le titre de cas.Citant la JavaDoc de java.util.regex.Modèle.