在任何情況下(查找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
你爲什麼在你的例子輸出掛斷最後'「'-char – 2012-07-16 17:20:49
@rubberboots - 因爲只有白色的空間應該用下劃線,任何其他非字母和數字來代替字符應該被替換爲沒有任何內容 – pstrjds 2012-07-16 17:24:51
我看到了,所以你希望在一次傳遞中有不同的替換文本,這在C++ regex中不起作用,如果有人發現這個問題,我想用這個太;-) – 2012-07-16 17:52:38