console.info("<p>[email protected]</p>".match(/([a-zA-Z0-9.-_+]+@[a-zA-Z0-9.-]+\.[a-z]{2,10})/g))
["<p>[email protected]"]
Может ли кто-нибудь помочь мне понять, почему символы < >
соответствуют этому регулярному выражению? Я всегда думал, что .
в классе символов []
интерпретируется буквально.
Когда я удаляю .
, он больше не возвращает этот тег абзаца.
Это соответствует диапазону .-_
от 46 до 95 ascii, где <
и >
равны 60 и 62.
-
в конце класса символов.
Дополнительное примечание ко всему «регулярному выражению для адресов электронной почты» — это интересно читать по этому вопросу.
Пожалуйста, взгляните на эти сайты: список доменов верхнего уровня; действительные/недействительные адреса; регулярное выражение для адреса электронной почты RFC822
В вашем регулярном выражении есть потенциальная скрытая проблема:
([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.-_+]
до и после. Обратите внимание, что @
и ^
сопоставлялись в исходной версии, но затем перестали сопоставляться после перемещения -
в конец класса.
«Дох! да так и сделал.
Вы сопоставляете .-_
(все символы в диапазоне от .
до _
), который включает все символы в диапазоне ASCII 46–95.
Чтобы это исправить, избегайте -
, написав \-
([a-zA-Z0-9.\-_+]+@[a-zA-Z0-9.-]+\.[a-z]{2,10})
^ note backslash here
Вы также можете просто изменить порядок. ._-
Что ж, если мы обсуждаем трюки, вы также можете поставить ]
в качестве первого символа предметов набора. Приводит к любопытному регулярному выражению []-]
, которое соответствует ]
или -
.-_
выглядит подозрительно. Между.
и_
есть мир.