我想在#include预处理器中找到所有使用正则表达式的Foo示例。到目前为止,我只能使用模式#include "(.*?)Foo(.*?)"
匹配一个示例。用Bar i替换Foo,使用#include "$1Bar$2"
当我将Foo替换为Bar时,下面的示例
#include "abcFoo1/Foo123/aFoo"
成为
#include "abcBar1/Foo123/aFoo"
我一直在试图弄清楚如何使它匹配#include语句中的所有Foo示例,并在替换后获得以下结果。
#include "abcBar1/Bar123/aBar"
P.S.我正在尝试使用文本编辑器(如Notepad++或Visual Studio等IDE)对许多字符串进行此操作。
4条答案
按热度按时间uz75evzq1#
你可以在下面的例子中使用这个正则表达式。Notepad++(或任何使用PCRE的东西),如果你想一次完成:
细分:
(?:#include ".*?|(?<!^)\G.*?)
-具有2个备选项的未捕获组:#include ".*?
-字符串的开头,后跟非贪婪匹配的任何内容(?<!^)\G.*?
-\G
是前一个匹配结束时的位置,后面跟着上面的非贪婪值。这里需要使用\G
,因为否则正则表达式引擎将无法两次匹配相同的部分。(?<!^)
行开头的负向后看是为了不匹配Foo
高于#include
s的情况(因为\G
从字符串的开头开始),这不应该发生,可能是可选的,但为了以防万一,为了完整的解决方案,包括了它。\K
-在匹配中不包含此之前的任何内容,以便仅匹配下一部分Foo
-要更换的部件我们只匹配
Foo
s,所以替换应该是Bar
。另外,在Notepad++中,
. matches newline
选项需要关闭。Demo with detailed explantation
8ljdwjyq2#
在Notepad++或Sublime文本中,单击Ctrl+H,您将获得查找+替换栏,您在查找字段中写入Foo,然后在替换栏中写入Bar,它应该是好的。
我认为不需要复杂的正则表达式模式。
46qrfjad3#
与查找带有
Foo
的字符串并用Bar
替换它不同,查找后面有#include
的Foo
或
ua4mk5z44#
如果文件名应该在双引号之间,并且您不想匹配双引号本身:
说明
(?:
备选方案的非捕获组#include\h+"
匹配#include
,后跟1+个水平空格字符(?=[^"\r\n]*")
正向预测,在同一行的右侧Assert"
|
或\G(?!^)
在前一个匹配的末尾而不是字符串的开头声明当前位置)
关闭非捕获状态[^"\r\n]*?
匹配"
以外的可选字符或换行符\KFoo
忘记到目前为止匹配的是什么,然后匹配Foo
Regex demo
如果字符串不应该包含空格,可以在取反字符类中使用
\s
:Regex demo