我正在尝试使用正则表达式从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"?
的冗余结果答案 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}");