【发布时间】:2012-02-10 13:23:04
【问题描述】:
回答this 问题我坚持这种情况。在我的正则表达式中使用不情愿匹配会带来这个结果
string s = Regex.Replace(".A.", "\\w*?", "B");
B.BAB.B
为什么它不匹配并替换 A?
【问题讨论】:
-
使用逐字字符串是个好策略,通过 System.String 保持正则表达式不变:@"\w+?"。
回答this 问题我坚持这种情况。在我的正则表达式中使用不情愿匹配会带来这个结果
string s = Regex.Replace(".A.", "\\w*?", "B");
B.BAB.B
为什么它不匹配并替换 A?
【问题讨论】:
因为\\w*? 匹配尽可能少的\w,包括其中的 0 个。
由于您有 \w* 而不是 \w+,因此正则表达式匹配 0 个或多个 \w。
由于您在\w* 上有一个额外的?,因此此正则表达式的最小可能匹配项是长度为0 的字符串''。
由于? 强制正则表达式匹配尽可能小的匹配,它只永远匹配0长度的字符串。它无法匹配单个字符 A,因为这将是比最短匹配更长的匹配。
因此,.A. 中的所有 0 长度字符串(即:''.''A''.'',其中每个可能的 0 长度字符串都标记为 '')被替换为“B”,即为“BAB”。
如果您想禁用此行为并替换至少一个\w,您可以使用正则表达式\w+?。但是,根据与以前相同的推理,? 强制它只替换长度为 1 的 \w,因此您不妨使用正则表达式 \w。
【讨论】: