【问题标题】:VSCode Find and Replace - find instances where part of search expression matches criteria and part does notVSCode 查找和替换 - 查找部分搜索表达式匹配条件而部分不匹配的实例
【发布时间】:2023-03-17 04:09:01
【问题描述】:

我想运行一个正则表达式来查找我的代码中声明动画持续时间的实例:例如duration: 2000 并将它们替换为该持续时间加上一个添加的变量 timeScale,例如duration: timeScale * 2000

我的一些代码库已经有了这个 - 所以我想找到duration: 后面没有timeScale 的所有实例。

我知道我可以通过说:^((?!timescale).)*$ 找到不存在的东西

但是我如何将它(或类似的东西)与确实存在的东西(duration:)结合起来?

更新:

我实际上可以在正则表达式测试器中运行它:

https://regex101.com/r/vY3pY3/1

duration: (?!timescale)

但是如何在 VSCode 中运行它?它给出了错误说unrecognized flag !

【问题讨论】:

  • 负前瞻是(?!timeScale),而不是(?!=timeScale),你有一个额外的等号。
  • 更新你的 VSCode 并使用^(?!.*timescale).*duration:。不知道为什么在您的情况下不接受前瞻。
  • @WiktorStribiżew - 在这种情况下,它似乎也不喜欢使用 !。有趣的是,如果我只是输入 ^(?!.*timescale) 它不会抛出错误,但它会说它匹配所有内容
  • @WiktorStribiżew - 您的解决方案,加上将 useRipGrep 设置为 false,对我有用!如果您将其发布为答案,我会接受。
  • @mheavers Posted, see below.

标签: javascript regex replace visual-studio-code


【解决方案1】:

在文件中查找 功能(CTRL+ALT+F)似乎在与 VSC 中的 Find (CTRL+F) 功能形成对比(奇怪!)。您可能想尝试支持前瞻的后者。 From documentations:

VS Code 确实支持正则表达式搜索,但是, 不支持反向引用、环视和多行匹配。 这是因为 VS Code 依赖于搜索工具 ripgrep,其中, 虽然速度极快,但不支持这些高级正则表达式功能。

这种行为完全出乎意料。您也可以尝试设置:

"search.useRipgrep": false

我认为可能有效,也可能无效。

【讨论】:

  • 只是说“没有结果”
  • 这种行为完全出乎意料。您可能还想尝试"search.useRipgrep": false,我认为它可能有效,也可能无效。事实上,他们已经将正则表达式引擎更改为不太有用的东西。什么原因?我不知道。
  • 有趣的是,将 useRipgrep 设置为 false 消除了错误,但仍然没有返回任何结果。
  • 你不能用其他工具来完成这个搜索/替换任务吗?
【解决方案2】:

根据您的反馈,确保将useRipGrep 设置为false 并使用

^(?!.*timescale).*duration:

详情

  • ^ - 行首
  • (?!.*timescale) - 如果在除换行符之外的任何 0+ 字符后有 timescale 子字符串,则匹配失败
  • .* - 尽可能多的除换行符以外的任何 0+ 字符
  • duration: - duration: 子字符串

请参阅regex demo

注意:从VSCode 1.29 开始,您需要enable search.usePCRE2 option 才能在您的正则表达式模式中启用前瞻。

【讨论】:

    【解决方案3】:

    试试正则表达式:^(?:(?!timeScale).)*(duration: \d+)$

    替换为:$1 * timeScale

    Demo

    这适用于 Visual Studio Code 1.22.2

    【讨论】:

    • 好吧,我希望能够匹配任何数值的持续时间,而不仅仅是 2000。另外 - 如果我将 ! 粘贴到搜索窗口中,则会出现同样的错误
    • @mheavers,我已经更新了正则表达式和演示以接受任何数值。另外,您使用的是哪个版本的 Visual Studio Code?​​span>
    • 我使用的是 1.24.1。你能看看我的问题中的截图,看看它是否与你的匹配(减去错误)
    • @mheavers,当我执行 Ctrl+H(在当前文件中查找和替换)时,它可以工作。但是,当我执行 Ctrl + Shift + H (在文件中查找和替换)时,我会遇到与您相同的错误。
    猜你喜欢
    • 2019-07-29
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    相关资源
    最近更新 更多