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不一定,有些库提供了这样的功能(请参见我的答案);-)尝试了一下,它所做的只是去除匹配的字符。它不会用替换字符串替换它。