【问题标题】:Regex.Replace has strange behavior at reluctant matchRegex.Replace 在不情愿的匹配中有奇怪的行为
【发布时间】:2012-02-10 13:23:04
【问题描述】:

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

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

B.BAB.B

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

【问题讨论】:

  • 使用逐字字符串是个好策略,通过 System.String 保持正则表达式不变:@"\w+?"。

标签: c# java regex


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 是的,看来确实是索引的问题……匹配0索引的空,切换到1的索引,这里也是空。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
  • 2021-06-27
  • 2018-06-13
相关资源
最近更新 更多