252 votes

Javascript + regex Unicode

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.

225voto

Tomalak Points 150423

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.

58voto

mgibsonbr Points 12998

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.

32voto

Tim Down Points 124501

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 .

11voto

Jan Goyvaerts Points 10402

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.

1voto

Reid Johnson Points 506

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X