Regex 正则表达式管道混淆
这段代码怎么会返回true 要匹配的字符串:Regex 正则表达式管道混淆,regex,Regex,这段代码怎么会返回true 要匹配的字符串:ab 模式:/^a | b$/ 但当我用这样的括号插入时: 模式:/^(a | b)$/ 然后,它将返回false第一种方法以a开头或以b结尾 第二个表示1个字符,一个a或一个b没有括号的第一个模式相当于/(^a)|(b$)/ 原因是,管道操作符(“替换操作符”)在所有正则表达式操作符中具有最低的优先级:(第一个标题下的第三段)/^a | b$/匹配以a开头或以b结尾的字符串。因此它与afoo,barb,a,b匹配 /^(a | b)$/:匹配以a或b
ab
模式:/^a | b$/
但当我用这样的括号插入时:
模式:/^(a | b)$/
然后,它将返回
false
第一种方法以a
开头或以b
结尾
第二个表示1个字符,一个
a
或一个b
没有括号的第一个模式相当于/(^a)|(b$)/
原因是,管道操作符(“替换操作符”)在所有正则表达式操作符中具有最低的优先级:(第一个标题下的第三段)
/^a | b$/
匹配以a
开头或以b
结尾的字符串。因此它与afoo
,barb
,a
,b
匹配
/^(a | b)$/
:匹配以a
或b
开头和结尾的字符串。因此,它要么匹配a
要么匹配b
而不匹配其他内容
这是因为在正则表达式操作符中,更改|
的优先级非常低
|
的优先级低于锚定,因此您说的是^a
或b$
(这是真的),而第二个是指“一个字符串,或者a
或者b
”(这是假的).在^a | b$
中,您将在开头匹配a
,或在结尾匹配b
<> > <代码> >(a,b)$ < /C> >您匹配<代码> < <代码> >或<代码> b>代码>(在开始和结束时)。 PHP、C++、Python,您要问的是ReGEX实现?(在我看来像是PHP PCRE。)我相信他们对我提供的代码有相同的实现,所以我把它们放在标签上:/它的优先级较低,而不是较高!呃,当然,我的意思是它以前被评估过:)我总是发现这个较低/较高的东西是武断和违反直觉的……但它以前没有评估过——它是在之后评估的。最低优先级最后计算,最高优先级第一。这应该是直观的。我认为是“之前/之后”的术语造成了混乱,因为最外层/最大层实际上表明优先级较低。