Regex.Replace在不情愿的比赛中有奇怪的行为

本文关键字:Replace 不情愿 Regex | 更新日期: 2023-09-27 18:23:57

在回答这个问题时,我坚持这种情况。在我的正则表达式中使用不情愿的匹配导致

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

B.BAB.batr

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

Regex.Replace在不情愿的比赛中有奇怪的行为

因为''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