在C ++中将g ++和Visual Studio 14 2015编译器与regex一起使用时会得到不同的结果

当我注意到g ++(MinGW)与Visual Studio 14 2015编译器(均在Windows上)之间存在一些不规则之处时,我正在使用C ++中的正则表达式。这是我尝试过的代码:

#include <iostream>
#include <vector>
#include <string>
#include <regex>

static const std::string data = "\n    a = 10\n    b = 20\n";

int main(int argc, char* argv[])
{
    auto strIt = data.begin();

    while (strIt != data.end())
    {
        std::regex e("^[ \t\n\r]");
        std::smatch m;
        std::string s(strIt, data.end());

        if (std::regex_search(s, m, e))
        {
            strIt += m[0].str().size();
        }
        else
        {
            std::cout << "s = \"" << s << "\"" << '\n';
            break;
        }
    }
}

用g ++编译时,我得到了预期的输出

s = "a = 10\n    b = 20\n"

但是当使用Visual Studio编译器时,它会吐出

s = "b = 20\n"

忽略整个“ a = 10”部分。通过调试功能在Visual Studio中进行了进一步调查之后,我看到m变量保留了“ a = 10”部分之后的空间。

您知道为什么会这样吗?我是否在没有注意到的情况下犯了一个大错误?请帮忙。

安东

首先,一个简化的示例:

#include <iostream>
#include <string>
#include <regex>

using namespace std;

int main() {
    const string data = "abc\nXabc";
    regex re("^X");
    smatch match;
    if (regex_search(data, match, re))
        cout << "match: " << match.str() << endl;
    else
        cout << "no match" << endl;
    return 0;
}

Visual Studio 2015输出:

匹配:X

MinGW 7.1.0的输出:

没有匹配


因此,差异减少到^正则表达式中匹配行的开头还是仅匹配字符串的开头。在C ++ 17中,它由regex::flag_type传递给regex构造函数参数确定

31.5.1位掩码类型syntax_option_type

类型syntax_option_type是实现定义的位掩码类型。设置其元素的效果在表130中列出。语法_option_type类型的有效值最多应具有以下语法元素之一:ECMAScript,基本,扩展,awk,grep,egrep,set。如果未设置语法元素,则默认语法为ECMAScript。


表130 —语法_选项_类型的影响

...

multiline —如果选择了ECMAScript引擎,则指定^匹配行的开头,$匹配行的结尾。

为了^匹配行首,regex需要像这样初始化对象:

regex re("^X", regex_constants::multiline);

总之,根据C ++ 17标准,MinGW的行为是正确的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Ubuntu中将Virtualenv与Python和Visual Studio Code一起使用

用g ++编译c ++ 14代码

python所需的vcvarsall.bat才能从Visual Studio 2015(v 14)中进行编译

Emscripten和C ++ 14

在Visual Studio中的Clang中启用C ++ 14

Visual Studio 2013和2015中的C ++编译器错误C2280“试图引用已删除的函数”

无法使用Visual Studio 2015命令行工具编译和链接简单的C ++程序

Visual Studio 2015 C ++和程序集未生成

如何在Visual Studio 2015中使用roslyn C#编译器?

编译器指令如何在Visual Studio 2015中与project.json一起使用

C ++朋友功能模板重载和SFINAE在clang ++,g ++,vc ++中的不同行为(C ++ 14模式)

使用Visual Studio编译器分析内联的C ++函数

在Visual Studio中将Debug与Release for C ++ .lib结合使用

Visual Studio 2010,本地SSRS报表查看器14,预览为空,但“导出和打印”工作正常

C ++ 14 RAM的使用

简单的C#WinForm应用程序显示在Visual Studio中具有3个线程。任务管理器显示14-16个线程。为什么?

在C ++ 14中继承模板化的operator =:g ++和clang ++的不同行为

Visual Studio代码任务以编译和运行.c文件

使用g ++编译器在Visual Studio中编译C ++程序会在最后生成%

C ++:dll在Visual Studio 2017上不起作用,但可与g ++一起使用

调试时Visual Studio Code g ++无法与c ++ 17编译

C ++ Primer第14章readStr示例无法在Visual Studio 2019中编译

C ++:使用Visual Studio编译器时的const指针

如何使用Visual Studio和C#Win Forms使Column AutoSize功能与ListView一起使用

可能的Visual Studio 2015 C ++编译器和IntelliSense错误

C ++错误C3646,C2059和C2238 Visual Studio 2015(社区)

使用C和Visual Studio 2015的ANSI

如何使用Visual Studio 14 2015 x64构建OpenEXR 2.2?

当默认标准是 201402L (c++14) 时,g++ 与 g++ -std=c++14 不同吗?