常用符号“\pS”未 'matched' 使用 std::wregex
Common symbols '\pS' not been 'matched' using std::wregex
我正在使用下面的代码尝试使用正则表达式匹配符号,(例如,我正在尝试匹配圆星符号,http://graphemica.com/%E2%9C%AA)
#include <regex>
#include <iostream>
int main() {
std::wsmatch matches;
std::wstring x = L"✪";
// std::wregex e(L"(\pS)+");
std::wregex e(L"([[:S:]]+)");
if (std::regex_match(x, matches, e))
{
// never reached
std::cout << "Never reached";
}
std::cout << "Bye.";
return 0;
}
符号 ✪ (0x272A) 不匹配,我也尝试了其他符号,其中 none 有效,(© 例如)。
我试过[:S:]
、\pS
和\p{S}
,其中none有效,(最后一个抛出异常)
这是一个类似的,(但不是同一个命名空间),问题与 boost 库一样,()
ECMAScript 第三版都不是。 POSIX 正则表达式语法也不支持 Unicode 类别字符 类。您可以使用基于 \u
和 \U
的字符范围自行形成它们,但是希望 \p{So}
之类的东西在目前的规范下是不可能的。
正如我在 上回答的那样,如果您真的想使用它们,Boost.Regex 通过 boost::u32regex
支持它们(如果构建时启用了 ICU 支持)。 (PCRE/PCRE2 也支持它们,但与大多数 C 库一样,我不愿为新的 C++ 代码推荐它们。)
我正在使用下面的代码尝试使用正则表达式匹配符号,(例如,我正在尝试匹配圆星符号,http://graphemica.com/%E2%9C%AA)
#include <regex>
#include <iostream>
int main() {
std::wsmatch matches;
std::wstring x = L"✪";
// std::wregex e(L"(\pS)+");
std::wregex e(L"([[:S:]]+)");
if (std::regex_match(x, matches, e))
{
// never reached
std::cout << "Never reached";
}
std::cout << "Bye.";
return 0;
}
符号 ✪ (0x272A) 不匹配,我也尝试了其他符号,其中 none 有效,(© 例如)。
我试过[:S:]
、\pS
和\p{S}
,其中none有效,(最后一个抛出异常)
这是一个类似的,(但不是同一个命名空间),问题与 boost 库一样,(
ECMAScript 第三版都不是。 POSIX 正则表达式语法也不支持 Unicode 类别字符 类。您可以使用基于 \u
和 \U
的字符范围自行形成它们,但是希望 \p{So}
之类的东西在目前的规范下是不可能的。
正如我在 boost::u32regex
支持它们(如果构建时启用了 ICU 支持)。 (PCRE/PCRE2 也支持它们,但与大多数 C 库一样,我不愿为新的 C++ 代码推荐它们。)