Почему точка в классе символов не соответствует только буквальному периоду - PullRequest
0 голосов
/ 30 мая 2019
console.log("<p>email@address.com</p>".match(/([a-zA-Z0-9.-_+]+@[a-zA-Z0-9.-]+\.[a-z]{2,10})/g))

["<p>email@address.com"]

Может кто-нибудь помочь мне понять, почему символы < > соответствуют этому регулярному выражению?Я всегда думал, что . в классе символов [] интерпретируется буквально.

Когда я удаляю ., он больше не возвращает этот тег абзаца.

Ответы [ 2 ]

3 голосов
/ 30 мая 2019

Вы соответствуете .-_ (все символы в диапазоне от . до _), что включает все символы в диапазоне ASCII 46-95.

Чтобы это исправить, выйдите из -, написав \-

([a-zA-Z0-9.\-_+]+@[a-zA-Z0-9.-]+\.[a-z]{2,10})
            ^ note backslash here
3 голосов
/ 30 мая 2019

В вашем регулярном выражении есть потенциальная скрытая проблема:

([a-zA-Z0-9.-_+]+@[a-zA-Z0-9.-]+\.[a-z]{2,10}

Если вы внимательно посмотрите на первый класс символов, вы увидите, что дефис определяет диапазон от . до _. Это может быть непреднамеренно включая символы, которые вы не хотите. Попробуйте переместить дефис в конец класса символов:

([a-zA-Z0-9._+-]+@[a-zA-Z0-9.-]+\.[a-z]{2,10}

Вот демоверсия регулярного выражения для [a-zA-Z0-9.-_+] до и после . Обратите внимание, что @ и ^ сопоставлялись в исходной версии, но затем перестали сопоставляться после перемещения - в конец класса.

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