C#中奇怪的Regex行为

本文关键字:Regex 行为 | 更新日期: 2023-09-27 18:20:16

我正试图使用正则表达式从C#中的一个较长单词中提取一些算术表达式。例如,我有一个单词"FooNo12Bee"。我使用以下正则表达式代码,它返回两个匹配项,"No12"answers"No"作为结果:

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

如果我使用下面的表达式,没有偏执,也没有任何"否"的替代选项,它按照我预期的方式工作,它只返回"No12":

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

这两个表达式之间的区别是什么?为什么使用偏旁性会导致"否"的冗余结果?

C#中奇怪的Regex行为

正则表达式中的圆括号是捕获组;这意味着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}");

我无法解释他们是如何调用它的,但这是因为在它周围放括号是在创建一个新组。在这里解释得很好

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

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

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