web-dev-qa-db-fra.com

Faire correspondre les caractères accentués avec les expressions rationnelles Javascript

Voici un extrait amusant que j'ai rencontré aujourd'hui:

/\ba/.test("a") --> true
/\bà/.test("à") --> false

Cependant,

/à/.test("à") --> true

Tout d'abord, wtf?

Deuxièmement, si je veux faire correspondre un caractère accentué au début d'un mot, comment faire? (Je voudrais vraiment éviter d'utiliser des sélecteurs exagérés comme /(?:^|\s|'|\(\) ....)

52
nickf

Cela a fonctionné pour moi:

/^[a-z\u00E0-\u00FC]+$/i

Avec l'aide de ici

61
Wak

La raison pour laquelle /\bà/.test("à") ne correspond pas est parce que "à" n'est pas un caractère Word. La séquence d'échappement \b Ne correspond qu'entre une limite de caractère Word et un caractère non Word. /\ba/.test("a") correspond car "a" est un caractère Word. Pour cette raison, il existe une frontière entre le début de la chaîne (qui n'est pas un caractère Word) et la lettre "a" qui est un caractère Word.

Les caractères Word dans l'expression régulière de JavaScript sont définis comme [a-zA-Z0-9_].

Pour faire correspondre un caractère accentué au début d'une chaîne, utilisez simplement le caractère ^ Au début de l'expression régulière (par exemple /^à/). Ce caractère signifie le début de la chaîne (contrairement à \b Qui correspond à n'importe quelle limite de Word dans la chaîne). C'est l'expression régulière la plus basique et standard, donc ce n'est certainement pas exagéré.

40
Riimu

Stack Overflow avait également un problème avec les caractères non ASCII dans l'expression régulière, vous pouvez le trouver ici . Ils ne font pas face aux limites de Word, mais peut-être vous donnent quand même des conseils utiles .

Il y a un autre page , mais il veut faire correspondre les chaînes et non les mots.

Je ne sais pas, et je n'ai pas trouvé maintenant, une ancre pour votre problème, mais quand je vois quels monstres regex dans mon premier lien sont utilisés, votre groupe, que vous voulez éviter, n'est pas exagéré et à mon avis votre solution.

2
stema
const regex = /^[\-/A-Za-z\u00C0-\u017F ]+$/;
const test1 = regex.test("à");
const test2 = regex.test("Martinez-Cortez");
const test3 = regex.test("Leonardo da vinci");
const test4 = regex.test("ï");

console.log('test1', test1);
console.log('test2', test2);
console.log('test3', test3);
console.log('test4', test4);

S'appuyer sur la réponse de Wak et Cœur:

/^[\-/A-Za-z\u00C0-\u017F ]+$/

Fonctionne également pour les espaces et les tirets.

Exemple: Leonardo da vinci, Martinez-Cortez

1
Craig1123