2016-04-02 59 views
0

我想字符串, 對於如內更換子內更換子:字符串是aa0_a a1_b b3_c * a0_a, 所以我想,以取代b1_a的子a0_a,但我不希望aa0_a被替換。 基本上,子字符串「a0_a」(將被替換)之前和之後都不應出現字母表。一個字符串C++

+1

的[用一個字符串替換字符串的一部分(HTTP可能重複:// stackoverflow.com/questions/3418231/replace-part-of-a-string-with-another-string) –

+0

看到這個鏈接http://www.cplusplus.com/reference/string/string/replace/ – Shiv

回答

3

這正是正則表達式擅長的。它自C++ 11以來就存在於標準庫中,如果你有一箇舊版本,你也可以使用Boost。

使用標準庫版本,你可以做(​​ref):

std::string result; 
std::regex rx("([^A-Za-Z])a0_a[^A-Za-Z])"); 
result = std::regex_replace("aa0_aa1_bb3_c*a0_a", rx, "$1b1_a$2"); 

(請注意:未經測試)

+0

謝謝,它的工作,唯一的事情是,1美元打印整個rx子字符串,而我們只想要該字符串的第一個字符 – user2665673

+0

括號分隔字符串這個..([^ A-Za-z])(a0_a)..正則表達式把它分成兩部分,所以$ 1只會取第一部分,即[^ A-Za-z] – user2665673

0

如果你遍歷每個角色,就足夠簡單了。一些僞代碼:

string toReplace = "a0_a"; 
for (int i = 0; i < myString.length; i++) { 
    //filter out strings starting with another alphabetical char 
    if (!isAlphabet(myString.charAt(i))) { 
    //start the substring one char after the char we have verified to be not alphabetical 
    if (substring(myString(i + 1, toReplace.length)).equals(toReplace)) { 
     //make the replacement here 
    } 
    } 
} 

請注意,在查看子字符串時,您需要檢查索引超出範圍。

+0

是的,那將工作的小字符串,但我不會做這個操作很多次,遍歷字符串的每個字符將是繁瑣的..... – user2665673

+0

所以,每次我們可以查找子字符串,然後檢查位置(索引-1)處的字符,是一個字母..... 有沒有更快的方式,直到現在我正在使用boost: :replace_all,想要一個類似的功能,可以考慮到這個條件以及 – user2665673

相關問題