2012-02-22 51 views
2

我需要根據它們的 QChar::category替換QString中的字符。在STDLIB方面,我想根據謂詞替換QString中的元素

string.erase(std::remove_if(begin(string), end(string), 
          [](QChar c) { 
          QChar::Category cat = c.category(); 
          return cat == .... || cat == ...; }), 
      string.end()); 

另外,我很高興與基於Unicode字符 類,我可以使用QString::replace工作的正則表達式。

這是可能與QString或我真的需要將字符串 在std::vector<QChar>和回?

編輯:我想類別保持

  • 第一個系統字符:$,_,或以Unicode類別「大寫字母(陸)」,「小寫字母的任何字符(LL ),「Titlecase letter(Lt)」,「Modifier letter(Lm)」,「Other letter(Lo)」或「Letter number(Nl)」
  • 其餘:第一個項目符號加上任何U + 200C零寬度非連接字符,U + 200D零寬度連接字符和Unicode類別中的字符「非間距標記(Mn)」,「間距組合標記(Mc)」,「十進制數字號碼(Nd)」或「連接或標點符號(Pc)「。

我可以先做/多次通過休息。

+0

要刪除哪些類別? – sgibb 2012-02-22 18:26:28

+0

@sgibb那些不構成有效JavaScript標識符的。我會將它們添加到帖子中。 – pmr 2012-02-22 18:27:05

回答

4

Qt提供了自己的方式來做這樣的事情。無論是好的,還是不值得懷疑,但Qt的習慣會

QString result; 
result.reserve(string.size()); 
foreach (const QChar& c, string) { 
    if (is_good(c)) { 
     result += c; 
    } 
} 

當然,你可以用lambda表達式做到這一點,std::for_each

std::for_each(string.begin(), string.end(), 
        [&result](QChar c) 
        { 
         if (is_good(c)) {result += c; } 
        } 
    ); 

但它不是Qt習慣。

請注意,從字符串中刪除符號較慢,然後在保留空間的情況下添加新的符號,這就是爲什麼第一個代碼示例很快的原因。

+0

同樣好。謝謝。我通常更喜歡就地操作,因爲它們更易於編寫代碼,而不是扔在臨時對象上,並將它們重新分配給原始對象,但這在這裏並不重要。 – pmr 2012-02-22 18:52:44