1

我正在努力与 C++ 匹配的 unicode 正则表达式std::regex。我发现该std::regex_search函数在 Mac OS 和 Linux 上可能返回不同的值。

这是示例代码。

#include "string"
#include "regex"
#include "iostream"
#include "locale"

void regex_test() {
  std::locale::global(std::locale("en_US.UTF-8"));
  {
    std::wstring str(L"水");
    std::wregex re(L"\\w+", std::regex::collate);

    if (std::regex_search(str, re)) {
      std::cout << "match" << std::endl;
    } else {
      std::cout << "failed to match" << std::endl;
    }
  }
}

int main() {
  regex_test();
  return 0;
}

在 Debian Stretch 上,上面的代码打印match,而在 Mac OS BigSur 上打印failed to match.

我构造了正则表达式std::regex::collate并设置了语言环境,以使表达式对语言环境敏感。该表达式\w应捕获所有 Unicode 字字符。在 Linux 上确实如此,但在 Mac OS 上则不然。

我怀疑它可能与语言环境有关,所以我将语言环境更改为en_US.UTF-8Mac OS,但它不起作用。

另外我尝试在 Linux 上将编译器从 GCC 6.3.0 更改为 Clang 12,结果仍然与 GCC 相同。在 Mac OS 上,我没有尝试将编译器从 Apple Clang 切换到 GCC。

你能帮我解决这个问题吗?谢谢!

4

0 回答 0