【问题标题】:Find multiple occurrences of a character after another character在另一个字符之后查找一个字符的多次出现
【发布时间】:2021-07-07 14:08:50
【问题描述】:

我需要在一个字符之后查找并替换多个出现的字符。

我的文件如下所示:

b
a
b
b

我需要用c替换a之后的所有b

b
a
c
c

我想出了这个:a((\n|.)*)b 作为查找表达式,a$1c 作为替换选项,但是它只替换最后一个匹配项而不是所有匹配项。

我正在使用 VSCode 的全局搜索和替换选项。

我找到了一种肮脏的方式来实现我想要的:我在 .* 匹配一次之后添加了一个 ? 惰性量词,然后我应用了替换。然后我可以再做一次,它将取代下一场比赛。我这样做,直到所有匹配项都被替换。

但是,如果有数千个匹配项,这将不可用,如果只有 1 个找到,知道是否有正确的方法来做这将是非常有趣的。

如何匹配a 之后的所有b

【问题讨论】:

    标签: regex visual-studio-code


    【解决方案1】:

    你可以使用

    (?<=a[\w\W]*?)b
    

    替换为c详情

    • (?&lt;=a[\w\W]*?) - 正向后视,匹配紧接在 a 前面的位置,然后是任何零个或多个字符(尽可能少)
    • b - 一个b

    另外,请参阅Multi-line regular expressions in Visual Studio Code 了解更多跨行匹配任何字符的方法。

    演示:

    替换后:

    如果你需要在多个文件中使用这样的替换,你需要知道文件搜索和替换 VSCode 功能中使用的 Rust 正则表达式功能确实要弱得多,既不支持\K,也不支持@ 987654335@,也不是无限宽度的后视。我建议使用 Notepad++ Replace in Files 功能:

    (?:\G(?!\A(?&lt;!(?s:.)))|a)[^b]*\Kb 模式匹配

    • (?:\G(?!\A(?&lt;!(?s:.)))|a) - 两个选项之一:
      • \G(?!\A(?&lt;!(?s:.))) - 上一次成功匹配的结束((?!\A(?&lt;!(?s:.))) 是从\G 中排除文件开始位置所必需的)
      • | - 或
      • a - 一个a
    • [^b]* - 除b 之外的任何零个或多个字符出现
    • \K - 省略匹配的文本
    • b - b 字符。

    【讨论】:

    • 由于我不知道的原因,它不能作为全局搜索:“lookbehind assertion is not fixed length”:/可能是某种性能限制......
    • @papillon 您只能在文档查找和替换功能中使用此正则表达式,而不是在文件搜索和替换中。
    • @papillon 您实际上可以使用 Notepad++ 和 JvdV 的表达式来替换多个文件。我的正则表达式在 Notepad++ 中看起来像 (?:\G(?!\A(?&lt;!(?s:.)))|a)[^b]*\Kb
    【解决方案2】:

    这可能不是最漂亮的,但经过尝试和测试,以下对我有用:

    (?:^a\n|\G(?<!\A))\n*\Kb$
    

    见在线demo。我不知道VSCode,但快速search 让我相信它应该按照链接的演示遵循基于 Perl 的 PCRE2 语法。

    • (?: - 打开非捕获组:
      • ^a\n - 起始行锚,后跟“a”和换行符。
      • | - 或者:
      • \G(?&lt;!\A) - 元转义,在上一个匹配的结尾或字符串的开头断言位置。否定的lookbehind 会阻止匹配字符串位置的开始。
      • ) - 关闭非捕获组。
    • \n* - 0+ 个换行符。
    • \K - 元转义,重置报告匹配的起点。
    • b$ - 匹配文字“b”,后跟结束线锚。

    【讨论】:

    • (?!^a\n|\G)b 对我有用,即使 b 字是一本书, , 将被改为做饭......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 2022-01-01
    • 2023-03-15
    相关资源
    最近更新 更多