c++ (0x, 11, tr1) の正規表現は、すべての場合に実際に機能するとは限りません (stackoverflow) ( gcc については、このページで正規表現というフレーズを調べてください) 。
コンパイラが必要な正規表現をサポートしているかどうかを試してください。
#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 : 1 つのパスで (一致に応じて) 2 つの異なる文字列に置き換えるには、ここでは機能しないと思います。/e
Perl では、これは評価された置換式 ( switch )内で簡単に実行できます。
したがって、既に推測したように、2 つのパスが必要になります。
...
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には 1 つがあります。以下はブーストで動作し、1 つのパスを使用します。
...
#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