4

我有一个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>

4

4 回答 4

11

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

例子

由此我们可以得出结论,[_|\_|\.]需要“_”,“|”之一 或者 ”。”。我们还可以看到“_”和“|”的双重声明 是不必要的。正如HamZa 评论的那样,可以缩短此段[_|.]以达到相同的结果。

事实上,我们甚至可以使用 Regexper 之类的资源来可视化整个表达式

于 2013-10-03T08:32:11.343 回答
5

它匹配管道字符、下划线或句点。
然而,它是不必要的复杂。它可能更简单。

可以缩短到这个
[|_.]

于 2013-10-03T08:32:17.913 回答
5

REGEX101是一个非常好的理解正则表达式的工具

Char class [_|\_|\.] 0 to 1 times [greedy] matches:

[_|\_|\. One of the following characters _|_|.
 [_|\_|\.] requires one of either "_", "|" or "."

请在此处查看 RegEx101 的此链接 您的表达式说明

于 2013-10-03T08:33:38.990 回答
3

[_|\_|\.]可能是为了匹配下划线 ( _) 或句点 ( .),应该写成[_.].

我有理由确定作者使用管道 ( |) 来表示“或”(即交替),这在字符类中不是必需的。正如其他响应者所说,管道实际上与文字管道匹配,但我不相信这是作者的意图。这是一个非常常见的初学者错误。

点 ( .) 是另一个特殊字符,当它出现在字符类中时会失去其特殊含义。没有必要像作者那样用反斜杠转义它,尽管它没有害处。并且下划线从来没有任何特殊含义;我什至不会试图猜测为什么作者列出了两次,一次有反斜杠,一次没有。

你没有问它,但?它也不属于那里。正如Kobi 所说,这就是使正则表达式如此低效的原因。这个想法是匹配一个或多个字母数字,然后可选地匹配一个分隔符(点或下划线),后面必须跟着更多的字母数字,根据需要重复。我会这样写:

[a-zA-Z0-9]+([_.][a-zA-Z0-9]+)*

如果它用完字母数字并且下一个字符不是_or .,它会跳过整个部分并尝试匹配下一部分。如果它不能做到这一点,它可以立即退出,因为没有匹配是可能的。但是你的正则表达式的编写方式,分隔符是可选的,独立于它应该分隔的东西,这使得它无用。正则表达式引擎必须不断备份,尝试匹配它已经以无穷无尽的、毫无意义的组​​合消耗的字符,然后才能放弃。不幸的是,这是另一个常见的错误。

于 2013-10-04T18:34:29.640 回答