我有一个js代码:
/^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/
但是[_|\_|\.]
是什么意思?(js regexp)
答案 0 :(得分:11)
如果我们使用像Regexper这样的资源,我们可以看到这个正则表达式:
由此我们可以得出结论:[_|\_|\.]
需要“_”,“|”之一要么 ”。”。我们还可以看到“_”和“|”的双重声明没必要。作为HamZa commented,此细分可以缩短为[_|.]
,以达到相同的效果。
事实上,我们甚至可以使用像Regexper这样的资源来显示entire expression。
答案 1 :(得分:5)
它匹配竖线字符,下划线或句点 然而,这是不必要的错综复杂的。它可能更简单。
可以缩短到这一点
[|_.]
答案 2 :(得分:5)
REGEX101是一个非常好的工具 理解正则表达式
Char class [_|\_|\.] 0 to 1 times [greedy] matches:
[_|\_|\. One of the following characters _|_|.
[_|\_|\.] requires one of either "_", "|" or "."
请在此处查看RegEx101的此链接 Your Expression explanation
答案 3 :(得分:3)
[_|\_|\.]
可能意味着匹配下划线(_
)或句点(.
),并且应该写为[_.]
。
我有理由相信作者使用管道(|
)来表示“或”(即alternation),这在character class内是不必要的。正如其他响应者所说,管道实际上与文字管道匹配,但我不认为这是作者的意图。这是一个非常普遍的初学者的错误。
点(.
)是另一个特殊字符,当它出现在字符类中时会失去其特殊含义。没有必要像作者那样用反斜杠来逃避它,尽管它没有任何伤害。下划线从未有过任何特殊含义;我甚至不会猜测为什么作者列出了两次,一次使用反斜杠,一次没有。
你没有问过它,但?
也不属于那里。这正是使正则表达式如此可怕的低效率的原因,如Kobi remarked。想法是匹配一个或多个字母数字,然后可选地匹配分隔符(点或下划线),必须跟随一些更多的字母数字,并根据需要重复。我就是这样写的:
[a-zA-Z0-9]+([_.][a-zA-Z0-9]+)*
如果字母数字用完且下一个字符不是_
或.
,它会跳过整个部分并尝试匹配下一部分。如果它不能做到这一点,它可以立即纾困,因为不可能匹配。但是你的正则表达式的编写方式,分隔符是可选的,与它应该分离的东西无关,这使得它无用。正则表达式引擎必须继续备份,尝试匹配它已经消耗的字符,它们可以放弃无休止,无意义的组合。不幸的是,这是另一个常见错误。