Соответствие акцентированных символов с регулярными выражениями Javascript - PullRequest
52 голосов
/ 25 марта 2011

Вот забавный фрагмент, с которым я столкнулся сегодня:

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

Однако,

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

Во-первых, wtf?

Во-вторых,если я хочу сопоставить акцентированный символ в начале слова, как я могу это сделать?(Я действительно хотел бы избежать использования чрезмерных селекторов, таких как /(?:^|\s|'|\(\) ....)

Ответы [ 4 ]

61 голосов
/ 19 июля 2012

Это сработало для меня:

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

С помощью здесь

40 голосов
/ 25 марта 2011

Причина, по которой /\bà/.test("à") не совпадает, заключается в том, что "à" не является символом слова.Экранирующая последовательность \b совпадает только между границей символа слова и символа без слова./\ba/.test("a") соответствует, потому что «а» является символом слова.Из-за этого существует граница между началом строки (которая не является символом слова) и буквой «a», которая является символом слова.

Символы слова в регулярном выражении JavaScript определяются как [a-zA-Z0-9_].

Чтобы сопоставить акцентированный символ в начале строки, просто используйте символ ^ в начале регулярного выражения (например, /^à/).Этот символ означает начало строки (в отличие от \b, которое соответствует любой границе слова в строке).Это самое простое и стандартное регулярное выражение, поэтому оно определенно не слишком.

2 голосов
/ 26 марта 2011

Переполнение стека также имеет проблему с не-ASCII символами в регулярном выражении, вы можете найти его здесь .Они не справляются с границами слов, но, возможно, в любом случае дают вам полезные советы.

Есть еще одна страница , но он хочет сопоставлять строки, а не слова.

Iне знаю и не нашел сейчас якоря для вашей проблемы, но когда я вижу, какие регулярные выражения монстров используются в моей первой ссылке, ваша группа, которую вы хотите избежать, не является чрезмерной, и, на мой взгляд, вашарешение.

0 голосов
/ 27 февраля 2019

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);

Построение ответа Вака и Кера:

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

Работает и для пробелов и тире.

Пример: Леонардо да Винчи, Мартинес-Кортес

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...