Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 仅使用一个正则表达式进行多次替换_Regex_Pcre - Fatal编程技术网

Regex 仅使用一个正则表达式进行多次替换

Regex 仅使用一个正则表达式进行多次替换,regex,pcre,Regex,Pcre,为了简单起见,我们假设有以下字符串: “约翰爱玛丽,玛丽爱杰克,杰克不在乎约翰和玛丽。” 假设我想用正则表达式来改变故事中的人物 约翰->约瑟夫 玛丽->杰西卡 杰克->基思 当然,我可以改变其中的一个,一次一个 但我想知道,是否有可能仅仅用一个正则表达式替换,比如“多次替换”或“有条件替换”,来改变所有的正则表达式 比如: 正则表达式:(?:(?约翰)(?玛丽)(?杰克)) 替换:((姓名1)约瑟夫(姓名2)杰西卡(姓名3)基思)) 这只是一个简单的例子 在我的应用程序中,我必须对每个字符串执

为了简单起见,我们假设有以下字符串:

“约翰爱玛丽,玛丽爱杰克,杰克不在乎约翰和玛丽。”

假设我想用正则表达式来改变故事中的人物

约翰->约瑟夫

玛丽->杰西卡

杰克->基思

当然,我可以改变其中的一个,一次一个

但我想知道,是否有可能仅仅用一个正则表达式替换,比如“多次替换”或“有条件替换”,来改变所有的正则表达式

比如:

正则表达式:
(?:(?约翰)(?玛丽)(?杰克))

替换:
((姓名1)约瑟夫(姓名2)杰西卡(姓名3)基思))

这只是一个简单的例子

在我的应用程序中,我必须对每个字符串执行大约20次替换,这会影响应用程序的性能

我使用的regex风格是PCRE


应用程序用C++与QT框架进行编码。

所以你使用的是所谓的PCRE味道。很好,但这并没有确切说明您正在使用哪个库。让我们在这里回顾几个选项,因为有两个不同的库声称是Perl兼容的

促进 这是最简单的解决办法<代码>boost::regex通过其

因此,您可以替换模式:

(约翰)(玛丽)(杰克)
使用替换字符串:

({name1}约瑟夫:({name2}杰西卡:基思))
当然,它是有效的。您可以在Notepad++中测试它,但下面是一些示例代码:

#包括
#包括
#包括
int main(int argc,字符**argv){
字符串主题(“约翰爱玛丽,玛丽爱杰克,杰克不在乎约翰和玛丽。”);
const char*replacement=“({name1}约瑟夫:({name2}杰西卡:基思))”;
boost::regex re((?John)|(?Mary)|(?Jake)”,boost::match_perl);
std::string result=boost::regex_replace(subject、re、replacement、boost::format_all);
标准::cout=0)
printf(“%s\n”,输出);
pcre2无代码(re);
返回0;
}
PCRE
使用PCRE(您不能在替换字符串或任何条件中使用正则表达式模式。那么您需要回调。@stribizhev不一定,有些库提供了这样的功能(请参见我的答案);-)尝试了一下,它所做的只是去除匹配的字符。它不会用替换字符串替换它。