2017-07-27 70 views
1

交替運算符|的範圍是什麼?在某些情況下,似乎|左側的所有內容都是一種替代方案,|右側的所有內容都是第二種替代方案。爲什麼替代方案不僅限於緊接在|之前和之後的捕獲組或令牌?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

爲什麼我不需要添加pa像這樣的房租?

((\d{3})\W+(SSN))|((SSN)\W+(\d{3})) 

我期望交替操作僅在周圍的捕獲組之間交替, 「SSN」或「SSN」。如果是這種情況,那麼結果將如下所示:

((\d{3})\W+(SSN)\W+(\d{3})) 

無匹配結果。

回答

1

這不是範圍的問題,這是優先級的問題,並alternation has the lowest precedence of all operators.

的交替操作員所有的正則表達式運算符的優先級最低。也就是說,它會告訴正則表達式引擎匹配垂直條左側的所有內容或垂直條右側的所有內容。如果您想限制交替的範圍,則需要使用括號進行分組。

你說你「期望交替操作只能在周圍的捕獲組之間交替。」但是,因爲交替具有最低的優先級,所以它匹配左側或右側的所有內容。