162 votes

Comment vérifier si un caractère est une lettre en Javascript ?

Je suis en train d'extraire un caractère dans une chaîne Javascript avec :

var first = str.charAt(0);

et je voudrais vérifier si c'est une lettre. Étrangement, il ne semble pas que cette fonctionnalité existe en Javascript. Du moins, je ne la trouve pas.

Comment puis-je tester cela ?

4 votes

Créer un numéro et le tester par rapport à NaN ? Ou simplement isNan(first) Je suppose.

6 votes

@Marc Si ce caractère était '-' par exemple, votre test n'indiquerait pas que c'est une lettre...

2 votes

Définir "lettre" ? L'alpha anglais seulement, ou autre chose ? Voulez-vous faire une "liste noire" ou une "liste blanche" ?

199voto

JaredPar Points 333733

Je ne crois pas qu'il existe une fonction intégrée pour cela. Mais il est assez facile de l'écrire avec une regex.

function isLetter(str) {
  return str.length === 1 && str.match(/[a-z]/i);
}

62 votes

Le code vérifie uniquement si le caractère est l'une des lettres de base de a à z (très peu de langues s'écrivent uniquement avec ces lettres). C'est très différent de la fonction Java qui a été mentionnée.

13 votes

Vous pouvez toujours utiliser une regex et ajouter des détails au fur et à mesure que vous en avez besoin : str.match(/[A-Z|a-z|ü|é]/i) ; //etc

0 votes

Peut-être que ça marche ? var char=str.toLowerCase(); return (char.length==1 && char>='a' && char<='z')

159voto

Filip Dalüge Points 666

En ce qui concerne ces caractères spéciaux qui ne sont pas pris en compte par des contrôles plus simples tels que /[a-zA-Z]/.test(c) il peut être utile de tirer parti de la transformation de la casse ECMAScript ( toUpperCase ). Il prendra en compte les classes de caractères Unicode non ASCII de certains alphabets étrangers.

function isLetter(c) {
  return c.toLowerCase() != c.toUpperCase();
}

REMARQUE : cette solution ne fonctionne que pour la plupart des écritures latines, grecques, arméniennes et cyrilliques. Elle ne fonctionnera PAS pour les caractères chinois, japonais, arabes, hébreux et la plupart des autres caractères.

20 votes

Intelligent. Mais d'après ma compréhension très limitée, cela ne fonctionne pas avec les alphabets qui n'ont pas de majuscules et de minuscules, comme le chinois ou le japonais.

6 votes

Un code génial (et astucieux). Fonctionne avec tous les alphabets latins.

2 votes

Personnellement, j'aime les fonctions comme celle-ci, car elles sont beaucoup plus faciles à regarder et à comprendre que les fonctions regex.

50voto

Sumer Points 598
if( char.toUpperCase() != char.toLowerCase() ) 

Retournera vrai seulement en cas de lettre

Comme indiqué dans le commentaire ci-dessous, si votre caractère n'est pas anglais, s'il s'agit d'un caractère Ascii élevé ou d'un caractère à double octet, vous devez ajouter la vérification du point de code.

if( char.toUpperCase() != char.toLowerCase() || char.codePointAt(0) > 127 )

1 votes

Juste pour ajouter deux pence, si vous le transformez en une fonction, ajoutez une vérification pour savoir s'il s'agit d'une chaîne de caractères et imposez que la longueur soit de un ou assurez-vous que la longueur soit de un. C'est pour éviter 1a par exemple.

1 votes

@AnchovyLegend Cela fonctionne parce qu'il n'y a pas de versions majuscules et minuscules des chiffres, de la ponctuation et des autres caractères non alphabétiques. En d'autres termes, leurs majuscules et leurs minuscules seront les mêmes, alors que les majuscules et les minuscules des lettres seront différentes. Personnellement, j'aime cette technique car elle est indépendante de la langue (elle fonctionne avec les langues comportant des signes diacritiques). Je n'ai pas effectué de tests de référence, mais je pense que cette méthode est plus efficace que la construction d'une regex. (Mais je pourrais me tromper, puisque les regex sont étonnamment rapides).

5 votes

Cela échoue pour les scripts qui ne font pas de distinction entre les majuscules et les minuscules, comme le chinois.

30voto

Michael Schmid Points 25

ES6 prend en charge les expressions régulières sensibles aux unicodes.

RegExp(/^\p{L}/,'u').test(str)

Cela fonctionne pour tous les alphabets.

Malheureusement, il y a un bogue dans Firefox (sera corrigé dans la version 78) qui empêche son utilisation universelle. Mais si vous pouvez contrôler votre environnement d'exécution et qu'il le prend en charge (par exemple, Node.js), il s'agit d'une solution simple et complète.

Atlernativement, XRegExp fournit un polyfill d'expression régulière moderne à tous les navigateurs.

15voto

Max Points 9361

Je pense que ce plugin a les capacités que vous recherchez : http://xregexp.com/plugins/ (lien github : https://github.com/slevithan/xregexp )

Avec lui, vous pouvez simplement faire correspondre toutes les lettres unicode avec \p{L} .

Lisez l'en-tête de ce fichier source pour voir quelles catégories il supporte : http://xregexp.com/plugins/xregexp-unicode-categories.js

1 votes

Avez-vous une expérience de l'utilisation de ce plugin sur des projets sur lesquels vous avez travaillé ? (je me demande simplement dans quelle mesure cette bibliothèque est fiable)

0 votes

Downvoting car c'est certainement une mauvaise réponse pour 2019

11 votes

@Peter Pourriez-vous mettre en lien une réponse que vous considérez comme appropriée pour 2019 ? J'ajouterais un lien vers celle-ci en tant que modification de ma réponse, tant que l'autre solution fonctionne avec tous les caractères Unicode.

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