使用正则表达式在 Visual Studio 中选择由双换行符分隔的文本块

Posted

技术标签:

【中文标题】使用正则表达式在 Visual Studio 中选择由双换行符分隔的文本块【英文标题】:select a block of text seperated by double newlines in visual studio using regex 【发布时间】:2016-02-11 14:58:10 【问题描述】:

我正在尝试在 Visual Studio 中编写一个正则表达式,它将捕获由双换行符分隔的任何文本块,因此我可以用 Doxygen 注释围绕它们。

namespace

   int a;
   int b;

   double c;
   double d;

   bool e;
   bool f;

变成:

namespace

   /** @ */
   int a;
   int b;
   /** @ */

   /** @ */
   double c;
   double d;
   /** @ */

   /** @ */
   bool e;
   bool f;
   /** @ */

我已经尝试过this answer 的解决方案,但即使未修改(这并不完全合适),Visual Studio 也会给我一个错误,即

'操作无法完成。参数不正确。'

我也试过了:

(\r?\n)2(.*\s)+(\r?\n)2

它只是无限期地挂起,因为我认为(.*\s) 最终会匹配整个文件中所有内容的几乎所有排列。

【问题讨论】:

它不适合我。但是,它只匹配double c; double d; @WiktorStribizew 它真的选择文本块吗? 是的,如果您启用正则表达式模式(当查找和替换窗格可见时,ALT + E)。 试试((?:\r?\n)2|^\s*)([\S\s]+?)((?:\r?\n)2) -> $1/** @ */\r\n$2\r\n/** @ */$3,但我觉得你以后必须调整空格。 @WiktorStribizew 谢谢,这个正则表达式绝对非常接近我的需要。 【参考方案1】:

这是 Notepad++ 中您需要的正则表达式,以及正确的缩进:

(^\s*namespace\b\s*\|(?!^)\G)((?:\r?\n)2([ \t]*)|(?:[ \t]*\r?\n)*([ \t]*))(\S[\S\s]*?)(?=[ \t]*(?:\s+\|(?:\r?\n)2))

并替换为$1$2/** @ */\r\n$3$4$5\r\n$3$4/** @ */

查看regex demo 和 Notepad++ 演示:

我相信

查找内容(?<=^\s*namespace\b\s*\(?:(?!\r?\n[ \t]*\r?\n)[\S\s])*)((?:\r?\n)2([ \t]*)|(?:[ \t]*\r?\n)*([ \t]*))(\S[\S\s]*?)(?=[ \t]*(?:\s+\|(?:\r?\n)2))替换为$1/** @ */\r\n$2$3$4\r\n$2$3/** @ */

在 VS2015 S&R 中应该是 also work,但现在,$n 反向引用在这个正则表达式中根本不起作用,我找不到原因。

【讨论】:

【参考方案2】:

从命名空间的左括号到右括号(包括括号),以下正则表达式给了我想要的结果,包括空格:

查找:((?:\r?\n)2|(\s*)\?\s*)((\s+)\S[\S\s]+?)((?:\r?\n)2|(?:\r?\n)\s*\)

替换:$1$4/** @ */\r\n$2$3\r\n$2$4/** @ */$5

【讨论】:

以上是关于使用正则表达式在 Visual Studio 中选择由双换行符分隔的文本块的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Studio 中查找和替换正则表达式

Visual Studio 2003 中的正则表达式替换问题

Visual Studio 使用正则表达式查找无重复项

使用正则表达式在 Visual Studio 中选择由双换行符分隔的文本块

Visual Studio、查找和替换、正则表达式

Visual Studio 正则表达式