c++ (0x, 11, tr1) 正则表达式并非在所有情况下都真正起作用(stackoverflow) (在此页面上查找短语regex以获取 gcc),因此最好使用 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:
如果可以在 中使用回调函数 tr()
,regex_replace
那么您可以在那里修改替换,例如:
string output = regex_replace(test, regex("\\s+|\\W+"), tr);
进行tr()
更换工作:
string tr(const smatch &m) { return m[0].str()[0] == ' ' ? "_" : ""; }
问题本来就解决了。不幸的是,在一些 C++11 正则表达式实现中没有这样的重载,但是 Boost有一个. 以下将与 boost 一起使用并使用一次传递:
...
#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++ 11或接下来的任何数字。
问候
rbo