Quelle est la façon la plus simple de faire correspondre des caractères non ASCII dans une expression régulière? Je voudrais faire correspondre tous les mots individuellement dans une chaîne d'entrée, mais la langue peut ne pas être l'anglais, donc je devrai faire correspondre des choses comme ü, ö, ß et ñ. En outre, c'est en Javascript / jQuery, donc toute solution devra s'appliquer à cela.
javascript
jquery
regex
Paul Wicks
la source
la source
all words
donne l'impression que vous ne voulez que des lettres non anglaises et pas tous les caractères non anglais comme l'indique le titre de votre question.Réponses:
Cela devrait le faire:
Il correspond à tout caractère qui n'est pas contenu dans le jeu de caractères ASCII (0-127, c'est-à-dire 0x0 à 0x7F).
Vous pouvez faire la même chose avec Unicode:
Pour unicode, vous pouvez consulter ces 2 ressources:
la source
[\u00BF-\u1FFF\u2C00-\uD7FF\w]
comme une lettre.[\u00C0-\u1FFF\u2C00-\uD7FF\w]
(sans point d'interrogation inversé¿
), comme pour les plages, se référer à BMP .00C0
estÀ
en Latin-1 Supplément ,1FFF
est le dernier caractère du grec étendu,2C00
est la première lettre en glagolitique etD7FF
est le dernier caractère en Hangul Jamo étendu-B. C'est donc tout sauf: les symboles et les caractères spéciaux sur les 2 premiers blocs; symboles dans les blocs du milieu; substituts, zone privée et caractères spéciaux dans les blocs d'extrémité.Cette expression régulière correspondra à tous les mots dans le texte de n'importe quelle langue ...
la source
[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]
La situation avec les expressions rationnelles, Unicode et Javascript est nul. Il est ridicule que les programmeurs doivent compter sur des bibliothèques externes pour reconnaître que "Αλφα" est un mot, ou même que "é" est une lettre.
Mais il en va ainsi.
Ce gars a écrit une bonne bibliothèque pour gérer Unicode en Javascript Regexes:
http://blog.stevenlevithan.com/archives/javascript-regex-and-unicode
Le truc Unicode est un plugin pour cette bibliothèque regex:
http://xregexp.com/
Voici un article sur l'extension Unicode:
http://blog.stevenlevithan.com/archives/xregexp-unicode-plugin
Et la page d'extension elle-même:
http://xregexp.com/plugins/
Excellent travail, mais cela me dérange encore que Javascript soit si en arrière à cet égard.
(Il a écrit un livre pour O'Reilly sur le sujet, il est donc tout à fait possible qu'il sache de quoi il parle.)
Il l'a implémenté en ajoutant des tables de caractères avec certaines propriétés. Ensuite, lorsque vous construisez un regex avec sa bibliothèque,
\p{charclass}
est remplacé par[allthecharactersintheclass]
.la source
Les échappements de propriété Unicode font partie des fonctionnalités d'ES2018.
Utilisation de base
Avec les échappements de propriété Unicode, vous pouvez faire correspondre une lettre de n'importe quelle langue avec l'expression régulière simple suivante:
Ou avec la sténographie, même terser:
Mots correspondants
En ce qui concerne le cas d'utilisation concrète de la question (mots correspondants), notez que vous pouvez utiliser Unicode Escapes la propriété dans les classes de caractères, ce qui rend facile de faire correspondre les lettres ensemble avec d' autres mots-caractères comme des traits d' union:
En assemblant tout cela, vous pouvez faire correspondre des mots de toutes les [1] langues avec ce RegEx magnifiquement court:
Exemple (branché sans vergogne à partir de la réponse ci-dessus ):
Prise en charge du navigateur
Pour l'instant (décembre 2018), je ne pouvais tester cette expression régulière qu'avec succès dans Chrome (et dans d'autres navigateurs basés sur Blink, tels que Opera, Vivaldi ou les futures versions de Microsoft Edge) et Safari (à partir de la version 12, tests antérieurs avec la version 11 échoué). Cependant, étant donné que la spécification est terminée et que la fonctionnalité est standardisée, attendez-vous à ce que d'autres navigateurs modernes suivent bientôt.
J'ai créé un petit site Web pour que vous puissiez vérifier si votre navigateur prend en charge les échappements de propriété Unicode.
Transpiler
Les échappements de propriété Unicode peuvent être transposés vers ES5 avec un outil appelé regexpu . Une démo en ligne est disponible ici . Comme vous pouvez le voir dans la démo, vous pouvez en fait faire correspondre des lettres non latines aujourd'hui avec l'expression régulière ES5 (horriblement longue):
Si vous utilisez Babel, il y a aussi un plugin regexpu alimenté pour que ( Babel plug - in v6 , Babel v7 plug - in ).
la source
u
drapeau a été introduit dans ES2015 et permet diverses fonctionnalités liées à Unicode (par exemple, la propriété s'échappe mentionnée dans ma réponse, même si celles-ci n'ont été introduites que quelques années plus tard). Étant donné que les fonctionnalités liées à Unicode modifient légèrement la sémantique de certains modèles d'expression régulière, cela doit être explicitement activé - en ajoutant cetu
indicateur.La réponse donnée par Jeremy Ruten est excellente, mais je pense que ce n'est pas exactement ce que Paul Wicks cherchait. Si je comprends bien, Paul a demandé à propos de l'expression de faire correspondre des mots non anglais comme
können
oumóc
. Le regex de Jeremy ne correspond qu'aux lettres non anglaises, il y a donc besoin d'une petite amélioration:ou
Ceci
[^\x00-\x7F]
et ces[^\u0000-\u007F]
parties permettent à l'expression régulière de correspondre aux lettres non anglaises.Ceci
(|)
est logique ou\w
est une lettre anglaise, donc([^\u0000-\u007F]|\w)
correspondra à une seule lettre anglaise ou non anglaise.+
à la fin de l'expression signifie qu'elle pourrait être répétée, donc l'expression entière permet à toutes les lettres anglaises ou non anglaises de correspondre.Ici, vous pouvez tester la première expression avec différentes chaînes et voici la seconde.
la source
Vous procédez de la même manière que pour tout autre caractère correspondant, mais vous utilisez \ uXXXX où XXXX est le numéro unicode du caractère.
Regardez: http://unicode.org/charts/charindex.html
http://unicode.org/charts/
http://www.decodeunicode.org/
la source
Toutes les versions Regex compatibles Unicode doivent avoir une classe de caractères spéciale comme \ w qui correspond à n'importe quelle lettre Unicode. Jetez un œil à votre saveur spécifique ici .
la source
J'ai eu un problème avec \ p fonctionnant comme prévu, j'ai donc utilisé une stratégie différente comme:
Trouvez tout ce qui n'est pas un caractère de tabulation jusqu'au caractère de tabulation suivant ... cela dépend évidemment de votre source de recherche, mais vous avez l'idée. Maintenant, je n'ai pas à comprendre quels caractères unicode fonctionnent et ne fonctionnent pas, etc.
la source