【问题标题】:When replacing with regexes, how do I append digits to the end of a match group?替换为正则表达式时,如何将数字附加到匹配组的末尾?
【发布时间】:2020-11-24 06:40:33
【问题描述】:

这是针对 Visual Studio 代码的,但我不确定它的相关性。

这是我的正则表达式:cost:(\d\d)

我正在尝试将该数字乘以 100。例如,将 cost:25 更改为 cost:2500

但如果我尝试这个替换,它会认为我要求的是组 #100,而不是组 #1 和两个零:cost:$100cost:25 更改为 cost:$100。如果我在两个零之后放置一个空格,它将替换为:cost:25 00。有没有办法告诉正则表达式引擎组名在哪里停止?

我尝试用cost:${1}00 替换,但这不起作用。将其更改为cost:${1}00:

【问题讨论】:

  • 尝试替换为$&00
  • @nhahtdh 不,它按字面意思打印
  • 奇怪,我的建议适用于最新版本
  • @nhahtdh 我使用的是最新版本。你确定你没有把它与 Visual Studio 混淆吗?
  • 不,我也在使用 VS Code 1.51.1

标签: regex visual-studio-code


【解决方案1】:

VS Code 1.51.1 上,此解决方案适用于替换(当前文件)和替换文件:

  • 使用$0 表示整场比赛:

    搜索:cost:\d\d

    替换:$000

正如评论中提到的,这两种方法仅适用于替换(当前文件),而不适用于文件中的替换:

  • 使用$& 表示整场比赛:

    搜索:cost:\d\d

    替换:$&00

  • 使用$1 指代第一个捕获组:

    搜索:cost:(\d\d)

    替换:cost:$100

    对于常规 Replace,替换字符串的解析规则与 JavaScript 相同。由于我们在正则表达式中没有 10 或 100 个捕获组,因此替换字符串被解析为 $1(在第 1 组中匹配的任何内容),后跟文字 00

    但是,对于文件中的替换,仅当$1 (cost:$10) 后面只有 1 位数字时替换才有效。一旦超过 2 位,则视为文字字符串替换

我玩过命名的捕获组 - 虽然它们在搜索字段中被识别,但我无法在替换字符串中引用它。 ${group}$<group> 等常用语法不起作用。


在进行了更多测试后,我发现文件中替换的实现方式存在一些奇怪的错误。

  • 这种带有命名捕获组的简单方法不起作用:

    搜索:cost:(?<n>\d\d)

    替换:cost:$<n>00

    但我们可以通过混合命名捕获组替换和编号组替换来使其工作:

    搜索:cost:(?<n>\d\d)()

    替换:cost:$2$<n>00

    我们也可以应用这个技巧来让编号组替换工作:

    搜索:cost:(\d\d)()

    替换:cost:$2$100

    替换字符串仅包含单个替换标记时似乎存在错误。

【讨论】:

  • 我希望我知道为什么第一个对我不起作用。我在同一个版本(1.51.1)。
  • #2 确实对我有用。我希望我知道为什么其他人都不知道。
  • 您使用的是什么操作系统?我在 Windows 上
  • 我刚刚发布了关于屏幕@DanielKaplan 的屏幕截图
  • #1 适用于“查找”小部件,但不适用于“跨文件搜索”。 #2 适用于查找和搜索。 #3 适用于“查找”小部件,但不适用于“跨文件搜索”。我认为@nhahtdh 在 Find 小部件中测试了它们,但 OP 正在使用 Search across Files 面板。
【解决方案2】:

为什么不使用组,而不是使用lookbehind匹配零宽度字符?

(?<=cost:\d\d)
  • 替换:
00

【讨论】:

  • 行得通!我希望你能理解,但我不想接受这个作为答案,因为这个解决方案对我有用。我仍然想知道如何做标题所说的。但是有一个upvote
  • 不错的+1,你也可以使用\d+
  • @DanielKaplan 我同意你的观点,这只是避免问题,而不是真正解决问题。
【解决方案3】:

您遇到了这里讨论的这个错误:VSCode Regex Find/Replace In Files: can't get a numbered capturing group followed by numbers to work out

提交问题:https://github.com/microsoft/vscode/issues/102221

尽管起源于此处,但不幸的是以“询问 SO 响应”关闭。尽管有一些变通方法 - 也在此处的 So 链接中注明,但您仍然可以对该问题发表评论并要求重新打开它。

奇怪的是,如果你只添加一个数字,比如cost:$10,它就可以正常工作——这就是我认为这是一个错误的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 2019-12-18
    • 2021-09-01
    • 1970-01-01
    相关资源
    最近更新 更多