[_ | \ _ | \。]的含义是什么?在Javascript regexps?

时间:2013-10-03 08:28:34

标签: javascript regex

我有一个js代码:

/^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/

但是[_|\_|\.]是什么意思?(js regexp)

4 个答案:

答案 0 :(得分:11)

如果我们使用像Regexper这样的资源,我们可以看到这个正则表达式:

Example

由此我们可以得出结论:[_|\_|\.]需要“_”,“|”之一要么 ”。”。我们还可以看到“_”和“|”的双重声明没必要。作为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]+)*

如果字母数字用完且下一个字符不是_.,它会跳过整个部分并尝试匹配下一部分。如果它不能做到这一点,它可以立即纾困,因为不可能匹配。但是你的正则表达式的编写方式,分隔符是可选的,与它应该分离的东西无关,这使得它无用。正则表达式引擎必须继续备份,尝试匹配它已经消耗的字符,它们可以放弃无休止,无意义的组​​合。不幸的是,这是另一个常见错误。