正则表达式中的pipe / or(|
)运算符应该短路。但是,在下面的示例中,匹配似乎不一致。具体来说,为什么短路在第一个示例中起作用而在第二个示例中不起作用?
短路在此example中起作用:
.*#|^#.*
仅与#
中的#B
匹配(即使右边的匹配#B
,也只有左边的模式)
在此example中,短路似乎不起作用:
#.*|.*#$
与A#
中的整个A#
匹配(即使左侧模式在结尾处仅与#
匹配并中断)
答案 0 :(得分:2)
管道运算符发生短路,但匹配器将尝试尽早在字符串中进行匹配。在第二个示例中,第二个模式匹配,因为它可以匹配字符串中的第一个字符,而第一个模式则不能。这优先于|
运算符的短路行为。