2012-07-16 63 views
12

我试图用不同的替换模式替换字符串中的某些模式。有条件地替换字符串中的正则表达式匹配

例子:

string test = "test replacing \"these characters\""; 

我想要做的是“与“_”和所有其他非字母或数字与空字符串的字符全部替换”。我创建了以下正则表达式,它似乎正确标记,但我不知道如何(如果可能)使用regex_replace执行条件替换。

string test = "test replacing \"these characters\""; 
regex reg("(\\s+)|(\\W+)"); 

预期的结果代替后,也可以:

string result = "test_replacing_these_characters"; 

编辑: 我不能使用升压,这就是为什么我离开它的标签。所以请不要包含提升的答案。我必须用标准库来做到这一点。这可能是一个不同的正则表达式可以完成目标,或者我只是停留两遍。

编辑2: 我不记得在查看原始正则表达式时,在\w中包含了哪些字符,我进一步简化了表达式。再次,目标是匹配\ s +的任何东西都应该替换为'_',任何匹配\ W +的东西都应该替换为空字符串。

+0

你为什么在你的例子输出挂断最后'“'-char – 2012-07-16 17:20:49

+0

@rubberboots - 因为只有白色的空间应该用下划线,任何其他非字母和数字来代替字符应该被替换为没有任何内容 – pstrjds 2012-07-16 17:24:51

+0

我看到了,所以你希望在一次传递中有不同的替换文本,这在C++ regex中不起作用,如果有人发现这个问题,我想用这个太;-) – 2012-07-16 17:52:38

回答

21

在任何情况下(查找gcc的phrase regex on this page)C++(0x,11,tr1)正则表达式do not really work (stackoverflow),所以最好在use boost一段时间。

你可以试试,如果你的编译器支持所需的正则表达式:

#include <string> 
#include <iostream> 
#include <regex> 

using namespace std; 

int main(int argc, char * argv[]) { 
    string test = "test replacing \"these characters\""; 
    regex reg("[^\\w]+"); 
    test = regex_replace(test, reg, "_"); 
    cout << test << endl; 
} 

在Visual Studio 2012Rc上述作品。

编辑1:通过两个不同的字符串在一个通(根据匹配)取代,我认为这不会在这里工作。在Perl中,这可以在评估替换表达式(/e switch)中轻松完成。

因此,你需要两遍,因为你已经怀疑:

... 
string test = "test replacing \"these characters\""; 
test = regex_replace(test, regex("\\s+"), "_"); 
test = regex_replace(test, regex("\\W+"), ""); 
... 

编辑2

如果有可能在regex_replace使用回调函数tr(),那么你可以修改那里的替代,如:

string output = regex_replace(test, regex("\\s+|\\W+"), tr); 

tr()做好更换工作:

string tr(const smatch &m) { return m[0].str()[0] == ' ' ? "_" : ""; } 

问题就得到了解决。不幸的是,在某些C++ 11正则表达式实现中没有这样的过载,但是Boost has one。下面将与升压工作,并使用一个通:

... 
#include <boost/regex.hpp> 
using namespace boost; 
... 
string tr(const smatch &m) { return m[0].str()[0] == ' ' ? "_" : ""; } 
... 

string test = "test replacing \"these characters\""; 
test = regex_replace(test, regex("\\s+|\\W+"), tr); // <= works in Boost 
... 

也许有一天这会与C++ 或任何数量随之而来的工作。

问候

RBO

+0

我不想用“下划线替换”,它应该被替换为空,这是我问题的症结所在,我想用_替换第一个匹配组,用空字符串替换第二个匹配组,我也应该有提到我无法使用boost – pstrjds 2012-07-16 17:27:03

+0

您在VS2012中运行的第二次编辑仍然无法解决我的问题,必须用_替换空格,并且必须用空字符串替换所有其他非字母和数字字符 – pstrjds 2012-07-16 17:36:30

+0

双通版本这在我的系统上,结果是'test_replacing_these_characters'。 – 2012-07-16 18:04:36