首页 > 解决方案 > 为什么字符类中的句点不只匹配文字句点

问题描述

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"]

有人可以帮我理解为什么这些< >字符匹配这个正则表达式吗?我一直认为.字符类中的 a是按[]字面意思解释的。

当我删除 时.,它不再返回该段落标记。

标签: javascriptregex

解决方案


您的正则表达式中存在潜在的隐藏问题:

([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.-_+] beforeafter的正则表达式演示。请注意,@and^在原始版本中被匹配,但在移动-到类的末尾后停止匹配。


推荐阅读