常用符号“\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++ 代码推荐它们。)