Quelqu'un connaît-il des bibliothèques JavaScript qui prennent en charge les expressions régulières compatibles avec Unicode ? Par exemple, il devrait y avoir quelque chose de semblable à \w qui peut correspondre à n'importe quel point de code dans la catégorie Lettres ou Marques (pas seulement les ASCII), et si possible avoir des filtres comme [[P*]] pour la ponctuation, etc.
Réponses
Trop de publicités?Situation de l'ES 6
La prochaine spécification du langage ECMAScript, édition 6, comprend des expressions régulières compatibles avec Unicode. Le support doit être activé avec l'option u
sur l'expression rationnelle. Voir :
Mais tant que l'ES 6 n'est pas terminé et largement adopté par les fournisseurs de navigateurs, vous devrez vous débrouiller tout seul.
Situation pour les ES 5 et inférieurs
Même si JavaScript fonctionne sur des chaînes Unicode, il n'implémente pas de classes de caractères compatibles Unicode et n'a aucun concept de classes de caractères POSIX ou de blocs/sous-gammes Unicode.
-
Vérifiez vos attentes ici : Testeur de classe de caractères Unicode Javascript RegExp ( Edit : la page originale est en panne, l'Internet Archive a encore une copie .)
-
Flagrant Badassery a un article sur JavaScript, Regex et Unicode qui apporte un éclairage sur la question.
-
Lire aussi Regex et Unicode ici sur SO. Vous devez probablement créer votre propre "classe de caractères de ponctuation".
-
Consultez le Expression régulière : Correspondre à une plage de blocs Unicode qui vous permet de construire une expression régulière JavaScript correspondant à des caractères appartenant à un nombre quelconque de blocs Unicode spécifiés.
Je viens de le faire pour les sous-gammes "Ponctuation générale" et "Ponctuation supplémentaire", et le résultat est aussi simple et direct que je l'aurais espéré :
[\u2000-\u206F\u2E00-\u2E7F]
-
Il y a aussi XRegExp un projet qui apporte Support Unicode pour JavaScript en offrant un moteur regex alternatif aux capacités étendues.
N'ayant pas non plus trouvé de bonne solution, j'ai écrit une petite script il y a longtemps, en téléchargeant les données de l'unicode spécification (v.5.0.0) et génère des intervalles pour chaque catégorie et sous-catégorie unicode dans le BMP. En gros, il convertit \p{...}
à une gamme de valeurs, tout comme la sortie de la fonction outil mentionné par Tomalak, mais les intervalles peuvent finir par être assez grands (puisqu'il ne s'agit pas de blocs, mais de caractères dispersés à plusieurs endroits différents).
Par exemple, une Regex écrite comme ceci :
var regex = unicode_hack(/\p{L}(\p{L}|\p{Nd})*/g);
Il sera converti en quelque chose comme ça :
/[\u0041-\u005a\u0061-\u007a...]([...]|[\u0030-\u0039\u0660-\u0669...])*/g
Je ne l'ai pas beaucoup utilisé en pratique, mais il semble fonctionner correctement d'après mes tests, alors je le poste ici au cas où quelqu'un le trouverait utile. Malgré la longueur des regex résultants (l'exemple ci-dessus a 3591 caractères une fois étendu), les performances semblent être acceptables (voir la page tests sur jsFiddle, chaque valeur en ms correspond à 1000 exécutions).
Voici le fuente et un petit test sur jsFiddle .
Mise à jour : cela ressemble à la même stratégie adoptée dans l'affaire du Plug-in XRegExp Unicode mentionnée par Tim Down, sauf que dans ce cas, ce sont des regex réguliers en JavaScript qui sont utilisés.
Comme mentionné dans d'autres réponses, les regex JavaScript ne prennent pas en charge les classes de caractères Unicode. Cependant, il existe une bibliothèque qui le permet : L'excellente bibliothèque de Steven Levithan XRegExp et son Plug-in Unicode .
En JavaScript, \w y \d sont ASCII, tandis que \s est Unicode. Ne me demandez pas pourquoi. JavaScript prend en charge \p avec des catégories Unicode, que vous pouvez utiliser pour émuler un système de gestion de l'information sensible à Unicode. \w y \d.
Para \d utiliser \p {N} (nombres)
Para \w utiliser [ \p {L} \p {N} \p {Pc} \p {M}] (lettres, chiffres, traits de soulignement, marques)
Mise à jour : Malheureusement, j'avais tort à ce sujet. JavaScript ne supporte pas officiellement \p non plus, bien que certaines implémentations puissent encore le supporter. La seule prise en charge d'Unicode dans les regex JavaScript consiste à faire correspondre des points de code spécifiques à l'aide de \uFFFF. Vous pouvez les utiliser dans les plages des classes de caractères.
Essayez ici :
http://inimino.org/~inimino/blog/javascript_cset
J'ai eu beaucoup de succès en utilisant cette bibliothèque javascript pour le regex unicode et elle est sous la licence MIT.