2012-07-16 67 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