【问题标题】:Backreference search replace with trailing numeral反向引用搜索替换为尾随数字
【发布时间】:2015-10-28 23:50:11
【问题描述】:

我正在使用 vim 查找一个四位数字并替换最后一个数字,但与使用 ${1} 值作为反向引用的新学校 sed 不同,它使用 \1 并且我正在努力追加以下号码。我需要做的:

  • a=1234 => a=1235
  • b=1374 => b=1375

我想我需要s/\(=[0-9]\{3\}\)4/=\1<xxx>5/g 其中是零长度字符。 我试过s/\(=[0-9]\{3\}\)4/=${1}5/g,但它没有使用反向引用。 有趣的是s/\(=[0-9]\{3\}\)4/=\15/g 做得对,但是有一个极端情况,实际上有 15 个反向参考组...

【问题讨论】:

  • 就我个人而言,我只是使用搜索模式来查找四位数字和<C-a>,因为我找到了它们...
  • 没有 15 个反向引用组

标签: search vim replace backreference


【解决方案1】:

只能有 9 个子匹配。 \1\9\0 这是整场比赛。您可以在 :help s/\1:help /\1 的帮助中看到这一点,其中仅列出 1 到 9。因此,尾随数字没有歧义。 \15 始终是第一个子匹配项,后跟 5。如果超过 9 个,也会出现错误。

如果你使用所有这些,你的正则表达式可能太复杂了。


如果您想在替换命令中进行加法,我会使用带有表达式的替换。这是通过将\= 作为替换的开始并将其后的内容视为vim 表达式来完成的。

:s/=\zs\d\+/\=submatch(0) + 1/g

此功能的帮助页面是:help sub-replace-expression

【讨论】:

  • 太棒了:我没有意识到 Posix regex/GNU-ERE 被限制为 0-9;我发现这个比较正则表达式反向引用限制:dziury.eu/sennik/index.php?artikle=1296
  • @rupert160 vim 正则表达式不是 Posix 或 GNU-ERE。
猜你喜欢
  • 2011-10-06
  • 2019-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多