Regex.Replace在不情愿的匹配中有奇怪的行为

时间:2012-02-10 13:23:05

标签: c# java regex

回答this问题我坚持这种情况。在我的正则表达式中使用不情愿的匹配会带来这个结果

string s = Regex.Replace(".A.", "\\w*?", "B");
  

B.BAB.B

为什么它不匹配并替换A?

1 个答案:

答案 0 :(得分:5)

因为\\w*?匹配尽可能少\w包括0

由于您有\w*而不是\w+,因此正则表达式匹配0或更多\w

由于?上有一个额外的\w*,此正则表达式的最小可能匹配是0长度字符串''。

由于? 强制正则表达式匹配尽可能小的匹配,因此只有永远匹配0长度的字符串。它不能匹配单个字符A,因为这将是一个比最短的匹配更长的匹配。

因此,.A.中的所有0长度字符串(为:''.''A''.'',其中每个可能的0长度字符串标记为'')被替换为'B',为您提供'BAB'。

如果要禁用此行为并替换至少一个\w,则可以使用正则表达式\w+?。但是,通过与以前相同的推理,?强制它只能替换长度为1的\w,因此您也可以使用正则表达式\w