2017-07-11 18 views
0

私はこれらの文字列にマッチしたい(3つの数字で始まり、3つの同じ文字で続きます。ORは3つの同じ文字で始まり、3つの数字で続きます)。正規表現で()内のグループを定義して呼び出す方法は?

123xxx-xxx123 

xxx123-123xxx 

私が試した:

string pattern = @"^(\d{3}(x{3})\-x{3}\d{3})|(x{3}\d{3}-\d{3}x{3})"; 

Console.WriteLine(Regex.IsMatch("123xxx-xxx123", pattern)); // True 
Console.WriteLine(Regex.IsMatch("xxx123-123xxx", pattern)); // True 

を、私はグループにそれらをしたい、いくつかの重複したサブパターンがあることがわかります。例:グループ\d{3}をグループ(\d{3})に、\1と呼び出してください。

ので、製作中後の正規表現は、次のようになります。

私は更新されてきた何
string pattern = @"^((\d{3})(x{3})\-\2\1)|((x{3})(\d{3})-\2\1)"; 

(\d{3}(x{3})\-x{3}\d{3})その後((x{3})(\d{3})-\2\1)

(x{3}\d{3}-\d{3}x{3})((\d{3})(x{3})\-\2\1)に、テストしようとしています。出力:False,False。私はそれを編集する前に考えて何

( (group 1) (group 2) - \2 \1 ) | ( (group 1) (group 2) - \2 \1 ) 

ここで何が悪いのでしょうか?

p/s:javascriptの回答を受け入れることができます。ありがとうございました!

+2

ていますか?私はそれぞれ2 + 3と6 + 5を期待していたでしょう。 – jensgram

+0

@jensgramもう一度チェックして同じ結果が得られました。入力文字列は正しいです。最初のパターンは正しいです。しかし、更新パターンは間違っています。 – Vayne

+1

JSのスクラッチパッドのためのhttp://regexr.com/3gau6。 – jensgram

答えて

1

正規表現^((\d{3})(x{3})\-\2\1)|((x{3})(\d{3})-\2\1)は間違って後方参照インデックスを保持するために表示されます。

^((\d{3})(x{3})\-\2\1)|((x{3})(\d{3})-\2\1) 
12  3    45  6 

あなたが参照に変更することができ、次のいずれか

^((\d{3})(x{3})\-\3\2)|((x{3})(\d{3})-\6\5) 
    2  3    5  6 

を...または外側撮像グループを無視する(まだ参照を変更します代替ブランチでは:

^(?:(\d{3})(x{3})\-\2\1)|(?:(x{3})(\d{3})-\4\3) 
    1  2    4  3 

私はRegExrはそれが簡単にインデックスを検証できるようにすることを見つける:あなたは後方参照番号が正しいことを確認してください

enter image description here

+0

ありがとう!それは本当に役立ちます! – Vayne

関連する問題