std::regex_replace 在不同平台上的行为差异

问题描述 投票:0回答:1

在 C++20 上,我在 Apple clang 15.0.0 与 Windows 的 Visual Studio 2022 默认 MSVC 编译器之间使用

std::regex_replace
时遇到两种不同的行为。对于空模式和空替换字符串的情况,我得到不同的输出。在 Mac 上,替换后的字符串为空。在 Windows 上,该字符串是原始文本。

我的问题是:

  • 就 ECMA 风格的正则表达式(如果有任何区别)而言,哪个平台的行为正确?
  • C++ 标准是否提及了传递给
    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

c++ regex std
1个回答
0
投票

在我看来,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 相同的结果,因此显然至少有其他一些人同意这是正确的结果。

© www.soinside.com 2019 - 2024. All rights reserved.