如果这个
(°[0-5])
匹配°4
和这个
((°[0-5][0-9]))
匹配°44
为什么会这样
((°[0-5])|(°[0-5][0-9]))
匹配°4但不是°44?
答案 0 :(得分:3)
因为在正则表达式中使用逻辑OR时,正则表达式引擎在找到与正则表达式的第一部分(此处为°[0-5]
)匹配时返回第一个匹配项,并且在这种情况下,因为°[0-5]
匹配{{ 1}}在°4
中,它返回°44
并且不会继续匹配其他情况(此处°4
):
°[0-5][0-9]
A | B,其中A和B可以是任意RE,创建一个与A或B匹配的正则表达式。任意数量的RE可以由' |'分隔。通过这种方式。这也可以在组内使用(见下文)。 扫描目标字符串时,RE由' |'分隔。从左到右尝试。当一个模式完全匹配时,接受该分支。这意味着一旦A匹配,B将不会被进一步测试,即使它会产生更长的整体匹配。换句话说,' |'操作员从不贪心。要匹配文字' |',请使用\ |,或将其括在字符类中,如[|]。
答案 1 :(得分:1)
答案 2 :(得分:1)
因为交替运算符|
按指定顺序尝试替代选项并选择第一个成功匹配。除非正则表达式中的某些内容导致回溯,否则将永远不会尝试其他替代方案。例如,这个正则表达式
(a|ab|abc)
输入此输入时:
abcdefghi
只会匹配a
。但是,如果正则表达式更改为
(a|ab|abc)d
它将匹配a
。然后,由于下一个characyer不是d
,它会回溯并尝试下一个替代,匹配ab
。由于下一个字符仍然不是d
,它会再次回溯并匹配abc
...并且由于下一个字符为d
,因此匹配成功。
为什么不从
中减少正则表达式((°[0-5])|(°[0-5][0-9]))
到此?
°[0-5][0-9]?
它更简单易懂。