2009-12-13 116 views
1

我已經的std :: string與follwing格式簡單通配符匹配的std :: string

std::string s = "some string with @lable" 

我必須要找到的「@」的所有實例,然後在之後找到標識符「@」, 這個ID有一個值(在這種情況下,'lable'存儲在查找表中,然後我將用找到的值替換@和id。

例如,假設ID標籤的值爲' 1000'後,字符串將如下所示:

"some string with 1000" 

我的第一個版本使用了boost :: regex,但是當我被告知在接下來的幾個版本中不允許使用新的庫時,我不得不轉儲它。

所以有一些優雅的方式來做到這一點與香草std ::字符串和標準算法?

+3

您不允許使用新圖書館,但您可以自行編寫新圖書館? – 2009-12-13 15:22:31

+0

這是我在dilbert世界的生活;( – Eli 2009-12-13 19:11:16

+1

我認爲這是正則表達式實際上會是一個矯枉過正的情況,這種情況會比較慢,而且在Boost中,我甚至不認爲在這種情況下可以節省loc或複雜度。 – wilhelmtell 2009-12-13 19:52:57

回答

10

您可以使用std::find搜索@,並獲得一對迭代器,形成一個從@開始到下一個空白字符(或字符串結尾)的範圍。然後只需將迭代器傳遞給std::string::replace()即可完成實際的子字符串替換。

例如:

std::string s = "some string with @lable"; 
std::string::iterator beg = std::find(s.begin(), s.end(), '@'); 
std::string::iterator end = std::find(beg, s.end(), ' '); 
s.replace(beg, end, "whatever"); 

如果你也想數之類的標籤或回車空格,你可以使用帶有::isspace一起std::find_if

+0

+1。Mine可能是過度殺毒 – 2009-12-13 14:36:28

+1

不要忘記檢查你是否真的找到了要替換的東西,你沒有提到輸入的約束條件,如果字符串中可能存在一個以上的ID,如果一個人總是在場等等...... – 2009-12-13 14:37:46

1

是的。使用std :: find搜索@,然後使用std :: find搜索空間,並將所有內容複製到一邊。