2017-05-07 4 views
2

同じ単語に3回一致する正規表現を作成しようとしていますが、それらはコンマで区切られています。たとえば、入力は次のようになります。3つの繰り返し単語を見つけるための正規表現

HEY,HEY,HEY - match 
NO,NO,NO - match 
HEY,HI,HEY - no match 
HEY,H,Y - no match 
HEY,NO,HEY - no match 

これを行うにはどうすればいいですか?私はいくつかの例を見てきましたが、それらは文字ではなく単語に適しています。

^(\w+),\1,\1$ 

説明:

^:行の先頭

+1

@varun? 3つの単語が2つのカンマで区切られています – Json

+0

@Enigmativity私はそれを使用する必要がありますが、私はそこにこれを行うための他の方法があることを認識しています。しかし、要件は、正規表現を使用することです – Json

答えて

7

これはトリックを行う必要があります。 「HHEY、HEY、HEY」とのマッチングを避けるために必要です。

(\w+):1つ以上の単語の文字に一致します。これは最初のカペプルグループです。

,:文字カンマ。

\1:最初に取り込まれたグループの逆参照。つまり、前に(\w+)で一致したものと一致します。

,:文字カンマ。

\1:最初に取り込まれたグループの逆参照。

$:行末。 「HEY、HEY、HEYY」とのマッチングを避けるために必要です。

出典:https://msdn.microsoft.com/en-us/library/az24scfc(v=vs.110).aspx#Anchor_5

使用例

static void Main() 
{ 
    var threeWords = new Regex(@"^(\w+),\1,\1$"); 
    var lines = new[] 
    { 
     "HEY,HEY,HEY", 
     "NO,NO,NO", 
     "HEY,HI,HEY", 
     "HEY,H,Y", 
     "HEY,NO,HEY", 
     "HHEY,HEY,HEY", 
     "HEY,HEY,HEYY", 
    }; 

    foreach (var line in lines) 
    { 
     var isMatch = threeWords.IsMatch(line) ? "" : "no "; 
     Console.WriteLine($"{line} - {isMatch}match"); 
    } 
} 

出力:それについて定期的ではない何

HEY,HEY,HEY - match 
NO,NO,NO - match 
HEY,HI,HEY - no match 
HEY,H,Y - no match 
HEY,NO,HEY - no match 
HHEY,HEY,HEY - no match 
HEY,HEY,HEYY - no match 
+0

これは動作します!ここで何が行われているのか説明してもらえますか? – Json

+0

'\ 1' *バックリファレンス*、説明についてはhttp://www.regular-expressions.info/backref.htmlを参照してください。 –

+0

@vyrp説明をいただきありがとうございます! – Json

関連する問題