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

C++ 如何使用正则表达式处理C+中的中文标点符号+;,c++,chinese-locale,C++,Chinese Locale,我希望达到这样的结果: 之前: 有人可能会问:“那情绪、欲望、冲动、强迫症有什么区别呢?” 之后: 有人可能会问 那情绪 欲望 冲动 强迫症有什么区别呢 用空格代替中文标点符号 我尝试使用replace和replace\u if功能,但失败。代码如下: char myints[] = "有人可能会问:“那情绪、欲望、冲动、强迫症有什么区别呢?”"; std::vector<char> myvector ; std::replace_if (myvecto

我希望达到这样的结果:

之前:

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

之后:

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

用空格代替中文标点符号

我尝试使用
replace
replace\u 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'; 
char myints[]=”有人可能会问:“那情绪、欲望、冲动、强迫症有什么区别呢?”";
std::vector myvector;
std::替换_if(myvector.begin()、myvector.end()、“\\pP”和“);

std::cout假设您确实打算使用正则表达式,而不是一个字符一个字符的替换函数……以下是我使用
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
}
#包括
#包括
int main()
{
标准::wstring s(L)有人可能会问:“那情绪、欲望、冲动、强迫症有什么区别呢?”");
//用空格替换每一次标点;使用ECMAScript语法
s=std::regex_replace(s,std::wregex(L“[:punct:]+”),L“”);
//删除线末端的额外空间
s=std::regex_replace(s,std::wregex(L“^ |$”),L“);
返回(s!=L)有人可能会问 那情绪 欲望 冲动 强迫症有什么区别呢“”;//返回0
}

您是否尝试过
std::regex\u replace
?您有一个字节向量(C++类型
char
)<代码> RePosivIt,< /COD>对单个矢量元素进行操作。汉字不是字节。它们由两个或多个字节的序列表示,希望用UTF-8编码。<代码> RePosivie如果即使在语法正确的情况下也不能在这里工作。建议使用实际字符而不是字节。C++中,CHA。racter有类型
wchar\u t
。祝你好运。@n.m.:
wchar\u t
没有达到你希望的程度。如果你想使用实际字符,请使用Unicode库。
myints
的内容和大小取决于系统的编码、编译器,以及可能在编译时处于活动状态的代码页用于编译的机器。在任何组合中,
replace\u if
cout-Uh,我还注意到,
replace\u if
甚至不能远程执行您认为的操作。第三个参数应该是一个函数。您可能想要
std::regex
?编译器说regex\u replace不是std'wregex'的成员不是“std”的成员我的gcc版本是4.6.3Hmm,也许你可以升级到gcc 4.9或使用boost。