2017-05-07 196 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 

我该如何去做这件事?我看了一些例子,但它们只适用于角色,而不是单词。

+1

@varun什么是不正规呢?有3个单词用2个逗号分隔 – Json

+0

@Enigmativity我需要使用它,但我知道还有其他方法可以做到这一点。但要求是使用正则表达式 – Json

回答

7

这应该做的伎俩:

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

说明:

^:该行的开头。需要避免匹配“HHEY,HEY,HEY”。

(\w+):匹配一个或多个单词字符。这是第一个被捕的团体。

,:字符逗号。

\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' * back reference *,详见http://www.regular-expressions.info/backref.html –

+0

@vyrp非常感谢您的解释! – Json