我有一个js代码:</p>
/^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/
但是 是什么意思[_|\_|\.]
?(js regexp)</p>
我有一个js代码:</p>
/^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/
但是 是什么意思[_|\_|\.]
?(js regexp)</p>
它匹配管道字符、下划线或句点。
然而,它是不必要的复杂。它可能更简单。
可以缩短到这个
[|_.]
[_|\_|\.]
可能是为了匹配下划线 ( _
) 或句点 ( .
),应该写成[_.]
.
我有理由确定作者使用管道 ( |
) 来表示“或”(即交替),这在字符类中不是必需的。正如其他响应者所说,管道实际上与文字管道匹配,但我不相信这是作者的意图。这是一个非常常见的初学者错误。
点 ( .
) 是另一个特殊字符,当它出现在字符类中时会失去其特殊含义。没有必要像作者那样用反斜杠转义它,尽管它没有害处。并且下划线从来没有任何特殊含义;我什至不会试图猜测为什么作者列出了两次,一次有反斜杠,一次没有。
你没有问它,但?
它也不属于那里。正如Kobi 所说,这就是使正则表达式如此低效的原因。这个想法是匹配一个或多个字母数字,然后可选地匹配一个分隔符(点或下划线),后面必须跟着更多的字母数字,根据需要重复。我会这样写:
[a-zA-Z0-9]+([_.][a-zA-Z0-9]+)*
如果它用完字母数字并且下一个字符不是_
or .
,它会跳过整个部分并尝试匹配下一部分。如果它不能做到这一点,它可以立即退出,因为没有匹配是可能的。但是你的正则表达式的编写方式,分隔符是可选的,独立于它应该分隔的东西,这使得它无用。正则表达式引擎必须不断备份,尝试匹配它已经以无穷无尽的、毫无意义的组合消耗的字符,然后才能放弃。不幸的是,这是另一个常见的错误。