如何使用正则表达式来处理C ++中的中文标点符号

时间:2014-08-14 16:31:41

标签: c++ chinese-locale

我想达到这样的结果:

在:

  

有人可能会问:“那情绪,欲望,冲动,强迫症有什么区别呢”

后:

  

有人可能会问那情绪欲望冲动强迫症有什么区别呢

用空格替换中文标点符号。

我尝试使用replacereplace_if功能但失败了。像这样的代码:

char myints[] = "有人可能会问:“那情绪、欲望、冲动、强迫症有什么区别呢?”";
std::vector<char> myvector ;            
std::replace_if (myvector.begin(), myvector.end(), "\\pP", " ");                    
std::cout << "myvector contains:";
for (std::vector<char>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n'; 

1 个答案:

答案 0 :(得分:1)

假设你的意思是使用正则表达式,而不是逐字符替换函数......这就是我使用std::regex_replace的意思。可能有一个更优雅的正则表达式,可以用更少的惊喜来概括,但至少这适用于你的例子。

#include <regex>
#include <string>

int main()
{
    std::wstring s(L"有人可能会问:“那情绪、欲望、冲动、强迫症有什么区别呢?”");

    // Replace each run of punctuation with a space; use ECMAScript grammar
    s = std::regex_replace(s, std::wregex(L"[[:punct:]]+"), L" ");

    // Remove extra space at ends of line
    s = std::regex_replace(s, std::wregex(L"^ | $"), L"");

    return (s != L"有人可能会问 那情绪 欲望 冲动 强迫症有什么区别呢"); // returns 0
}