【问题标题】:Multi-line regular expressions in Visual StudioVisual Studio 中的多行正则表达式
【发布时间】:2010-10-25 17:38:58
【问题描述】:

有没有办法让 Visual Studio 跨多行执行正则表达式替换(让匹配跨越行边界)?我知道我可以使用很多编辑器,但奇怪的是这个功能被排除在 Visual Studio 之外。我错过了什么吗?

【问题讨论】:

    标签: regex visual-studio


    【解决方案1】:

    Visual Studio 2013 中的正则表达式已更改。 https://msdn.microsoft.com/en-us/library/2k3te2cs(v=vs.120).aspx

    要匹配两行以上的表达式,代码现在是:

    StartOfExpression.*\r?\n.*EndOfExpression

    【讨论】:

    • 谢谢你,这很好用,</label>.*\r?\n.*<div 其中\r?\n 是明显的carriage_return-new_line 和.* 用于匹配可能的制表符/空格
    • 我收到错误消息“目前不支持文字 '\n'”
    • @ELI7VH 我无法复制您的错误。您使用的是什么版本的 Visual Studio?
    【解决方案2】:

    在文件对话框中使用替换 Ctrl-Shift-H 和单行选项(?s):

    (?s)start.*end
    

    发现

    start
    two
    three
    end
    

    单行表示:每个文件都被视为单行,点. 匹配换行符\n。缺点:您必须使用 Find All 并全部替换,或者手动替换。查找下一个不起作用。

    对于非模态对话框Ctrl-H并找到next,使用(.*\n)*匹配任意行数:

    start(.*\n)*.*end
    

    无论哪种方式,您都可以通过插入 \n 来用多行替换您的发现。

    【讨论】:

    • 这行得通,但你想要额外的问号(end 之前),所以它不是贪婪的。即:start(.*\n)*.*?end
    • 贪心版尽可能匹配startend之间的字符。如果你想找到下一个end,请使用非贪婪版本:(?s)start.*?end,或start(.*\n)*?.*?end
    • 潜在用户注意事项:自 Visual Studio 2013 起不起作用。请参阅 Giles Roberts 的回答。
    • @relatively_random:你在使用(?s)时遇到问题了吗?
    • 是的,我做到了。它仍然适用于较新的 VS 版本吗?
    【解决方案3】:

    这适用于今天的 Visual Studio 2012:

    fooPatternToStart.*(.*\n)+?.*barPatternToEnd
    

    查看(.*\n)+? 部分如何跨多行进行匹配,非贪婪。
    fooPatternToStart 是您开始行上的一些正则表达式模式,而barPatternToEnd 是您可以在下面的另一行中找到的模式,下面可能有很多行...

    找到示例here

    简单有效:)

    注意: VS2012 之前,有效的模式是:fooPatternToStart.<em>(.</em>\n)+@.*barPatternToEnd

    【讨论】:

    • 注意,Visual Studio 2012 使用与代码中相同的正则表达式引擎进行查找/替换,因此上述内容变为:fooPatternToStart.*(.*\n)*?.*barPatternToEnd
    • @Brent:当然,最新版本的 VSTO 已经修复了这个问题。
    • 如果我想在开始和停止之间专门搜索文本怎么办?像这样? :编辑:sprintf.*(.*\n)+?.*log.*(.*\n)+?.*__func__sprintf__func__ 之间搜索log,谢谢! Tho.. 它似乎在寻找无穷大.. 如果只有一种方法来限制行数
    【解决方案4】:

    注意:这个答案是使用 Visual Studio 中使用的正则表达式语法,直到并包括 VS 2012。在 VS 2013 及更高版本中,正则表达式语法已更改。

    您可以在表达式中包含\n。例如,这里是一个正则表达式,我用它从任何不是存储过程的东西中“清除”自动生成的 SQL 脚本(它将匹配以包含“Object:”的行开头的文本块,后跟不是“StoredProcedure”,然后匹配以下行,直到一行包含单词“GO”):

    /\*+ Object\::b:b~(StoredProcedure)(.*\n)#GO\n
    

    【讨论】:

    • 注意:行终止符取决于文件的格式,所以Unix风格的文本只能使用\n,Mac风格的文本只能使用\r,windows风格的文本只能使用\r\n。跨度>
    • 注意二:请确保您没有同时勾选“匹配整个单词”,否则这不起作用!
    • 您能否添加一条说明,说明此答案仅适用于 Visual Studio 2012 及更早版本?
    【解决方案5】:

    您可能需要在表达式末尾使用 \r\n。

    【讨论】:

      【解决方案6】:

      非贪婪多行任意字符捕获,Visual Studio 2013+:

      .*?\r?\n.*?
      

      Giles Roberts 回答中的贪婪版本。

      【讨论】:

        【解决方案7】:

        对于在搜索 VS Code 时来到这里的每个人,我使用它来匹配从 script 到任何带有 2 个换行符(不包括换行符)的任何内容:

        script(.|\n)+?(?=\n\n)
        

        替换 script\n\n 以匹配它们之间的所有内容。

        【讨论】:

          猜你喜欢
          • 2017-04-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-31
          • 1970-01-01
          相关资源
          最近更新 更多