regex 如何在字符串中多次匹配模式并替换它们

krugob8w  于 2023-05-08  发布在  其他
关注(0)|答案(4)|浏览(169)

我想在#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)对许多字符串进行此操作。

uz75evzq

uz75evzq1#

你可以在下面的例子中使用这个正则表达式。Notepad++(或任何使用PCRE的东西),如果你想一次完成:

(?:#include ".*?|(?<!^)\G.*?)\KFoo

细分:

  • (?:#include ".*?|(?<!^)\G.*?)-具有2个备选项的未捕获组:
  1. #include ".*?-字符串的开头,后跟非贪婪匹配的任何内容
  2. (?<!^)\G.*?-\G是前一个匹配结束时的位置,后面跟着上面的非贪婪值。这里需要使用\G,因为否则正则表达式引擎将无法两次匹配相同的部分。(?<!^)行开头的负向后看是为了不匹配Foo高于#include s的情况(因为\G从字符串的开头开始),这不应该发生,可能是可选的,但为了以防万一,为了完整的解决方案,包括了它。
  • \K-在匹配中不包含此之前的任何内容,以便仅匹配下一部分
  • Foo-要更换的部件

我们只匹配Foo s,所以替换应该是Bar
另外,在Notepad++中,. matches newline选项需要关闭。
Demo with detailed explantation

8ljdwjyq

8ljdwjyq2#

在Notepad++或Sublime文本中,单击Ctrl+H,您将获得查找+替换栏,您在查找字段中写入Foo,然后在替换栏中写入Bar,它应该是好的。
我认为不需要复杂的正则表达式模式。

46qrfjad

46qrfjad3#

与查找带有Foo的字符串并用Bar替换它不同,查找后面有#includeFoo

(?=Foo)(?<=#include .*)Foo

Foo(?<=#include .*Foo)
ua4mk5z4

ua4mk5z44#

如果文件名应该在双引号之间,并且您不想匹配双引号本身:

(?:#include\h+"(?=[^"\r\n]*")|\G(?!^))[^"\r\n]*?\KFoo

说明

  • (?:备选方案的非捕获组
  • #include\h+"匹配#include,后跟1+个水平空格字符
  • (?=[^"\r\n]*")正向预测,在同一行的右侧Assert"
  • |
  • \G(?!^)在前一个匹配的末尾而不是字符串的开头声明当前位置
  • )关闭非捕获状态
  • [^"\r\n]*?匹配"以外的可选字符或换行符
  • \KFoo忘记到目前为止匹配的是什么,然后匹配Foo

Regex demo
如果字符串不应该包含空格,可以在取反字符类中使用\s

(?:#include\h+"(?=[^"\s]*")|\G(?!^))[^"\s]*?\KFoo

Regex demo

相关问题