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

Chu*_*ris 0 c# java regex

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

string s = Regex.Replace(".A.", "\\w*?", "B");
Run Code Online (Sandbox Code Playgroud)

B.BAB.B

为什么它不匹配并取代A?

mat*_*fee 5

因为\\w*?匹配尽可能少\w,包括其中的0个.

既然你\w*不是\w+,正则表达式匹配0或更多\w.

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

由于? 部队正则表达式匹配尽可能小的匹配越好,它只是不断与零长度字符串.它不能匹配单个字符,A因为这将是一个比最短的匹配更长的匹配.

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

如果要禁用此行为并至少替换一个\w,则可以使用正则表达式\w+?.但是,通过与以前相同的推理,这种?力量只能替换\w长度为1,所以你不妨使用正则表达式\w.