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}");
这两个表达式之间的区别是什么?为什么使用偏旁性会导致"否"的冗余结果?
如果你不想要一个捕获组,但仍然需要一个组来进行替换,请使用非捕获组;通过将?:
放在第一个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}");