C#中奇怪的正则表达式行为

时间:2014-09-01 11:47:55

标签: c# regex

我正在尝试使用正则表达式从C#中的较长单词中提取一些alfanumeric表达式。例如,我有'#34; FooNo12Bee"这个词。我使用以下正则表达式代码,它返回两个匹配项," No12"和"不"结果:

alfaNumericWord = "FooNo12Bee";
Match m = Regex.Match(alfaNumericWord, @"(No|Num)\d{1,3}");

如果我使用下面的表达式,没有paranthesis,没有任何替代#34; No"它按照我期望的方式工作,它只返回" No12":

alfaNumericWord = "FooNo12Bee";
Match m = Regex.Match(alfaNumericWord, @"No\d{1,3}");

这两个表达式之间有什么区别,为什么使用paranthesis导致" No"?

的冗余结果

3 个答案:

答案 0 :(得分:6)

正则表达式中的括号是捕获组;意味着paren之间的内容将被捕获并存储为捕获组。

如果您不想要捕获组但仍需要一个组进行更改,请改用非捕获组;将?:放在第一个paren之后:

Match m = Regex.Match(alfaNumericWord, @"(?:No|Num)\d{1,3}");

通常情况下,如果您因某种原因不想更改正则表达式,则只需从匹配中检索组0即可获得整个匹配(从而忽略任何捕获组);在您的情况下,使用m.Groups[0].Value

最后,您可以使用以下方法提高正则表达式的效率:

Match m = Regex.Match(alfaNumericWord, @"N(?:o|um)\d{1,3}");

答案 1 :(得分:1)

我无法解释他们如何称呼它,但这是因为在它周围加上括号创建了一个新组。很好地解释了here

  

除了将正则表达式的一部分组合在一起外,还有括号   还创建一个编号的捕获组。它存储了部分内容   字符串匹配的正则表达式部分   括号中。

     

正则表达集(值)?匹配Set或SetValue。在第一种情况下,   第一个(也是唯一一个)捕获组仍为空。在第二种情况下,   第一个捕获组与Value匹配。

答案 2 :(得分:1)

这是因为括号正在创建一个组。您可以使用?:删除该组 Regex.Match(alfaNumericWord, @"(?:No|Num)\d{1,3}");