我正在努力与 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。
你能帮我解决这个问题吗?谢谢!