Regex.Replace在不情愿的比赛中有奇怪的行为
本文关键字:Replace 不情愿 Regex | 更新日期: 2023-09-27 18:23:57
在回答这个问题时,我坚持这种情况。在我的正则表达式中使用不情愿的匹配导致
string s = Regex.Replace(".A.", "''w*?", "B");
B.BAB.batr
为什么它不匹配并替换A?
因为''w*?
匹配的'w
尽可能少,所以包括其中的0个。
由于您有'w*
而不是'w+
,因此正则表达式匹配0个或多个'w
。
由于'w*
上有一个额外的?
,因此此正则表达式的最小匹配项是长度为0的字符串"。
由于?
强制正则表达式匹配尽可能小的匹配,因此只有匹配0长度的字符串。它无法匹配单个字符A
,因为这将是比最短字符更长的匹配。
因此,.A.
中的所有0长度字符串(即:''.''A''.''
,其中每个可能的0长度字符串都标记为''
)都被替换为"B",从而得到"B.a.B"。
如果要禁用此行为并替换至少一个'w
,可以使用regex 'w+?
。然而,根据与以前相同的推理,?
强制它只替换长度为1的'w
,因此您还可以使用regex 'w
。