在 C++20 上,我在 Apple clang 15.0.0 与 Windows 的 Visual Studio 2022 默认 MSVC 编译器之间使用
std::regex_replace
时遇到两种不同的行为。对于空模式和空替换字符串的情况,我得到不同的输出。在 Mac 上,替换后的字符串为空。在 Windows 上,该字符串是原始文本。
我的问题是:
std::regex_replace
的参数及其行为?std::regex
是否存在变通办法,可以在两个平台上获得一致的行为,而无需在调用库之前清理输入?#include <iostream>
#include <string>
#include <regex>
using namespace std;
int main()
{
std::string text = "Excellent";
std::string pattern = "";
std::string replacement = "";
std::string result;
std::regex regexPattern(pattern, std::regex::ECMAScript | std::regex::icase);
result = std::regex_replace(text, regexPattern, replacement);
cout << "Result: " << result << endl;
}
在 MacOS 上
g++ -std=C++20 -Wall Test.cpp
输出为空字符串:
Result:
在 MSVC 上,输出是原始文本。
Result: Excellent
在我看来,MSVC 正在产生正确的输出。
您正在搜索一个空的正则表达式,它无法匹配任何内容。您尚未在对
format_no_copy
的调用中传递 regex_replace
标志,因此 (N4950, [re.alg.replace]/1):
如果没有找到这样的匹配并且
,则调用!(flags & regex_- constants::format_no_copy)
out = copy(first, last, out)
就其价值而言,Fedora 上的 gcc 和 clang 产生与 MSVC 相同的结果,因此显然至少有其他一些人同意这是正确的结果。