RegEx交替范围

时间:2017-07-27 00:22:59

标签: regex

交替运营商|的范围是什么?在某些情况下,似乎|左侧的所有内容都是另一种选择,|右侧的所有内容都是第二种选择。为什么替代方案不仅限于|之前和之后的捕获组或令牌?

我正在使用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}))

没有比赛。

1 个答案:

答案 0 :(得分:1)

这不是范围问题,而是优先问题,alternation has the lowest precedence of all operators.

  

交替运算符具有所有正则表达式运算符的最低优先级。也就是说,它告诉正则表达式引擎匹配垂直条左侧的所有内容,或垂直条右侧的所有内容。如果要限制更改的范围,则需要使用括号进行分组。

你说你“期望交替操作只在周围的捕获组之间交替。”但是,因为交替具有最低优先级,所以它匹配左边的所有内容或右边的所有内容