2017-07-27 9 views
1

交替オペレータ|の有効範囲は何ですか?いくつかのケースでは、|の左のものすべてが1つの選択肢であり、|のすべてが第2の選択肢であるように見えます。なぜ代替手段は|の直前と直後のキャプチャグループやトークンに限定されないのですか?RegEx交替範囲

私はRegExrでテストしていますが、私はJavaで正規表現を実行しています。

私は2つの短い正規表現があります。

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

(太字で一致)

SSNx 123 SSN

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

(太字で一致します。)

SSN123 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.

交代演算子は、すべての正規表現の演算子の最優先されます。つまり、正規表現エンジンは、垂直バーの左側にあるすべてのもの、または垂直バーの右側にあるすべてのものと一致するように指示します。交替の範囲を制限したい場合、グループ化のためにカッコを使用する必要があります。

あなたは、は、「周囲のキャプチャグループ間での交互の操作が交互に行われることを期待していました」と言いました。しかし、交替は優先順位が最も低いため、左にあるものすべてまたは右にあるものすべてに一致します。