【问题标题】:Multiline regular expression search in Visual Studio CodeVisual Studio Code 中的多行正则表达式搜索
【发布时间】:2018-10-04 13:23:49
【问题描述】:

多行正则表达式搜索在 VS Code 版本 1.27.2 中不起作用。

理论上aaa(\n|.)*bbb 应该找到从 aaa 开始并结束 bbb 的字符串,但它不起作用。 这里提到的解决方案Multi-line regular expressions in Visual Studio Code 也不起作用。

【问题讨论】:

标签: visual-studio-code vscode-settings


【解决方案1】:

2018年11月发布的v1.29增加了多行搜索。见multi-line search

VS Code 现在支持多行搜索!和编辑器一样,一个正则表达式 仅当搜索包含 \n 文字时,搜索才会在多行模式下执行。 Search 视图在每个多行匹配项旁边显示一个提示,其中 额外匹配线的数量。

由于在 ripgrep 工具中所做的工作,此功能成为可能 实现多行搜索。


多行搜索将在 v1.38 中加入 Find Widget。见multiline find "pre-release" notes

查找小部件中的多行搜索

Find Widget 现在支持多行文本搜索和替换。经过 按Ctrl+Enter,可以在输入框中插入新行。

.

在 Find Widget 中是 Ctrl+EnterShift+Enter 在搜索面板中(请参阅下面的 Deepu 回答)。 Shift+Enter 在 Find Widget 获得焦点时还有其他功能。

【讨论】:

  • 对于那些寻找快速复制粘贴的人来说,这是你用来匹配多行的方法 [\n\s]+
  • 使用(.*\n)+ 匹配一行或多行有或无内容,例如,<html>(.*\n)+</html> 匹配整个文档。
【解决方案2】:

是的,您可以在 VScode 中使用正则表达式进行多行搜索。

查找从aaa 开始并以第一个bbb 结束的多行文本块(惰性限定符)

aaa(.|\n)+?bbb

查找从aaa 开始并以最后一个bbb 结束的多行文本块。 (贪婪的限定符)

aaa(.|\n)+bbb

【讨论】:

    【解决方案3】:

    不使用正则表达式。

    现在可以在 1.30 及更高版本的 vs 代码中进行多行搜索,而无需使用正则表达式。

    在搜索框中键入 Shift+Enter 以插入换行符,搜索框将扩大以显示完整的多行查询。您还可以将编辑器中的多行选择复制并粘贴到搜索框中。

    【讨论】:

      【解决方案4】:

      我一直在寻找一种快速的方法来做到这一点,我得出了以下结论:

      start_text.*?(.|[\n])*?end_text

      start_text 和 end_text 是多行搜索的边界。

      分解正则表达式 ".?(.|[\n])?":

      1. ".?"将匹配从您的开始文本到行尾的任何字符。这 ”?”是否可以确保如果您的 end_text 在同一行上 . 无论如何都不会一直走到行尾(贪婪与惰性匹配)
      2. "(.|[\n])" 表示字符\空格或换行符
      3. “*?”指定匹配括号中的 0 个或多个表达式而不是贪心的。

      示例:

      • <meta.*?(.|[\n])*?/> 将从所有元标记的开头匹配到相应标记的结尾
      • <script.*?(.|[\n])*?</script> 将从所有脚本标签的开头匹配到各自的结束标签

      警告:

      使用 .*?(.|[\n])*? 不正确或部分填写 start_text 或 end_text 可能会导致 VS Code 崩溃。我建议要么写出整个表达式(这不会导致问题),要么在粘贴到正则表达式之前写下开始和结束文本。无论如何,当我试图删除部分开始和结束文本时,VS Code 冻结并迫使我重新加载文件。话虽如此,老实说,我在 VS Code 中找不到更好的东西。

      【讨论】:

      • 请注意,这不会捕获开始和结束之间的内容。您需要将正则表达式包装在像 (.*?(.|[\n])*?) 这样的捕获组中。
      【解决方案5】:

      您可以使用这个简单的正则表达式在多行中查找和替换:StringStart\r\nStringEnd

      例如

      public string MethodA(int x)
      { 
          var user;  
      }
      
      public string MethodB(string y)
      {
          var user;  
      }
      
      public string MethodC(int x)
      { 
           var user;  
      }
      
      public string MethodD(float x)
      { 
           var user;  
      }
      

      如果您想用客户替换用户变量的名称以及用户的方法参数名称,但仅限于 int 。

      那么要查找的正则表达式将是:int x)\r\nEnterBlankSpacesHereToReachTheString{\r\nEnterBlankSpacesHereToReachTheStringvar user

      要替换的正则表达式将是:int user)\r\nEnterBlankSpacesHereToReachTheString{\r\nEnterBlankSpacesHereToReachTheStringvar customer

      查看参考

      【讨论】:

      • 你的截图是 Visual Studio 的?
      【解决方案6】:

      我有类似的问题,这对我来说效果更好:

      aaa[.\n\r\t\S\s]*bbb
      

      这包括回车符 (\r)、换行符 (\n)、制表符 (\t)、任何空白符 (\s) 和任何非空白符 (\S)。似乎有一些冗余放置“。”和 "\S" 在一起,但在我的情况下,如果没有两者,它就不起作用。

      【讨论】:

        【解决方案7】:

        没有正则表达式:您可以复制多行文本并将其粘贴到“在文件中查找”形式:

        “全部替换”的结果:

        【讨论】:

        • 这个答案如何帮助在 Visual Studio 代码中进行多行正则表达式搜索?
        【解决方案8】:

        这种行为的原因很简单。

        尚未实现多行搜索。

        见:Support multi-line search for Global search

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-04-30
          • 2017-09-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-20
          • 2016-07-20
          • 2020-02-12
          相关资源
          最近更新 更多