交替运营商|
的范围是什么?在某些情况下,似乎|
左侧的所有内容都是另一种选择,|
右侧的所有内容都是第二种选择。为什么替代方案不仅限于|
之前和之后的捕获组或令牌?
我正在使用RegExr进行测试,但我将使用Java运行正则表达式。
我有两个简短的正则表达式:
(\d{3})\W+(SSN)
(以粗体匹配。)
SSNx 123 SSN
(SSN)\W+(\d{3})
(以粗体匹配。)
SSN 123 SSN
如果我像这样组合正则表达式:
(\d{3})\W+(SSN)|(SSN)\W+(\d{3})
正则表达式匹配(粗体)
SSN 123 SSN
SSNx 123 SSN
为什么我不必添加这样的括号?
((\d{3})\W+(SSN))|((SSN)\W+(\d{3}))
我期望交替操作仅在周围的捕获组之间交替,例如, “SSN”或“SSN”。如果是这种情况,那么结果将如下所示:
((\d{3})\W+(SSN)\W+(\d{3}))
没有比赛。
答案 0 :(得分:1)
这不是范围问题,而是优先问题,alternation has the lowest precedence of all operators.
交替运算符具有所有正则表达式运算符的最低优先级。也就是说,它告诉正则表达式引擎匹配垂直条左侧的所有内容,或垂直条右侧的所有内容。如果要限制更改的范围,则需要使用括号进行分组。
你说你“期望交替操作只在周围的捕获组之间交替。”但是,因为交替具有最低优先级,所以它匹配左边的所有内容或右边的所有内容