2016-11-13 107 views
1

我需要替換字符串中的子字符串。例如:在C++中替換子字符串不區分大小寫

輸入:

始終

決不

我會一直跑。總是!

輸出:

我將永遠不會運行。決不!

replace and find work fine。但是,問題是大小寫敏感的。我有這個簡單的功能來做到這一點,但這是不完整的。

string subTag(string s,string a,string b) 
{ 
    while(s.find(a)!=-1){ 
     s.replace(s.find(a), a.size(), b); 
    } 

    return s; 
} 

如何使搜索過程不區分大小寫?

+0

而問題是... :) –

+0

應該是大寫或小寫的話,或者他們是否混合,像neVer和alWays? –

+0

是的,這個詞可以混合使用。 –

回答

1

都轉換原始字符串搜索短語比搜索下:

string subTag(string s,string a,string b){ 
    std::string lower_s; 
    std::transform(s.begin(), s.end(), lower_s.begin(), ::tolower); 
    std::transform(a.begin(), a.end(), a.begin(), ::tolower); 
    auto position=lower_s.find(a); 
    while(position!=std::string:npos){ 
     s.replace(position, a.size(), b); 
     position=lower_s.find(a); 
    } 
    return s; 
} 

注:

  1. 你必須保持原有的s,因爲你需要在不改變其返回其案件。
  2. 您可以直接更改a的情況,因爲您不再使用它了。
  3. 你不需要改變b的情況,因爲你根本沒有使用它進行搜索。
1

用C++ 11,嘗試某事像這樣:

string subTag(string s,string a, string b) 
{ 
    auto pos = std::search(s.begin(), s.end(), a.begin(), a.end(), [](const char c1, const char c2){ return (std::tolower(c1)) == (std::tolower(c2));}); 
    if(pos == s.end()) 
     return ""; 
    auto pos2 = pos; 
    std::cout << *pos << std::endl; 
    std::advance(pos2, a.size()); 
    s.replace(pos, pos2, b); 

    return s; 
} 
相關問題