[|\|\.]的含义是什么?在Javascript正则表达式中?
我有一个js代码:[|\|\.]的含义是什么?在Javascript正则表达式中?,javascript,regex,Javascript,Regex,我有一个js代码: /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/ 但是[\u124;\\ u124;\.]?(js regexp)的含义是什么?如果我们使用这样的资源,我们可以可视化此正则表达式: 由此我们可以得出结论,[124;\ 124;\.]需要“124;”、“|”或“.”中的一个。我们还可以看到,“|”和“|”的双重声明是不必要的。因此,可以
/^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/
但是[\u124;\\ u124;\.]
?(js regexp)的含义是什么?如果我们使用这样的资源,我们可以可视化此正则表达式:
由此我们可以得出结论,[124;\ 124;\.]
需要“124;”、“|”或“.”中的一个。我们还可以看到,“|”和“|”的双重声明是不必要的。因此,可以将此段缩短为[|]
,以获得相同的结果
事实上,我们甚至可以使用诸如Regexper之类的资源来可视化。它匹配管道字符、下划线或句点。
然而,这是不必要的复杂。这可能更简单 它可以缩短为这个
[|.]
是一个非常好的工具
理解正则表达式
Char class [_|\_|\.] 0 to 1 times [greedy] matches:
[_|\_|\. One of the following characters _|_|.
[_|\_|\.] requires one of either "_", "|" or "."
请参见此处的RegEx101链接
[\\\\\\\\\.]
可能与下划线(
)或句点(
)匹配,并且应该写为[\.]
我相当肯定作者使用管道(|
)来表示“或”(即),这在一个文件中是不必要的。正如其他回复者所说,这个管道实际上与字面上的管道相匹配,但我不相信这是作者的意图。这是初学者经常犯的错误
点(
)是另一个特殊字符,当它出现在字符类中时,它将失去其特殊意义。没有必要像作者那样用反斜杠来逃避它,尽管它没有害处。下划线从来没有任何特殊意义;我甚至不想猜测作者为什么列出了两次,一次加反斜杠,一次不加反斜杠
你没有问过,但是?
也不属于那里。这就是为什么正则表达式如此低效的原因,就像。其思想是匹配一个或多个字母数字,然后可选地匹配一个分隔符(点或下划线),后面必须跟一些字母数字,根据需要重复。我会这样写:
[a-zA-Z0-9]+([_.][a-zA-Z0-9]+)*
如果它用完了字母数字,而下一个字符不是
\uu
或
,它将跳过整个部分并尝试匹配下一部分。如果它不能做到这一点,它可以立即纾困,因为不可能匹配。但是按照正则表达式的编写方式,分隔符是可选的,与它应该分隔的内容无关,这使得它毫无用处。正则表达式引擎必须不断地备份,试图匹配它已经在无休止、毫无意义的组合中使用的字符,然后才能放弃。不幸的是,这是另一个常见的错误。这是胡说八道,它是一个字符类,意思是match\uuuu或| or.
0或一次。它可以被缩短为[|.]?
,但我怀疑这是它的作者的意图。正则表达式是,并且将执行得很差。例如,在aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@a.a
:。除此之外,它不支持所有有效的域(如完整的Unicode)、TLD(如博物馆)或电子邮件名称(如email)+tag@example.com
)。你可以找到更好的模式。我的工作不是修复他的代码。我告诉他,他问我那块regex做了什么,我不想让他觉得我很刻薄,但我回答了他的问题。其他人已经说过正则表达式可以缩短,那么我为什么也要这样做呢。顺便说一句,我更新了我的答案,尽管在本页其他地方回答了4次。由于它用方括号括起来,
不需要转义[|.]
也可以。多可爱啊,有人删除了他们的评论,所以我看起来像个白痴。为什么在评论发表这么长时间后就可以删除它们?