使用正则表达式在 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 2003 中的正则表达式替换问题