gpt4 book ai didi

c++ - Visual C++ 正则表达式行为与 gcc

转载 作者:搜寻专家 更新时间:2023-10-31 02:19:03 27 4
gpt4 key购买 nike

我想从单个文件中提取多个 GLSL 源,用标题分隔。我写了这个小正则表达式,为我做这个:

(?:\n|^)-- (\w*)\.?(\d\d\d)?\.(\w\w\w?)\r?\n([\s\S\r\n]*?)(?=\n--|$)

在这样的源上运行:

-- passthrough.VS
in vec4 position;

void main(){
gl_Position = position;
}

-- mvp.VS
layout (location=0) in vec3 position;

uniform mat4 model;
#include "engine/shaders/vp_include.glsl"

void main () {
gl_Position = proj * view * model * vec4 (position, 1.0);
}

捕获组 ([\s\S\r\n]*?) 应该匹配着色器的主体。我包含了 \r\n 因为 Regex Working on regexr but not Visual Studio .

预期的输出(和要运行的代码)在这里:http://coliru.stacked-crooked.com/a/a890795f0c438a0b ,使用 gcc 编译(regex101.com 的引擎也提供了预期的输出)。

我的问题出在 Visual Studio 2015 上,最后一次捕获只匹配一个空字符串(其他捕获有效)。

我错过了什么吗?这是 VS 正则表达式实现中的错误吗?

最佳答案

出于某种原因,^$ 在 VS 的正则表达式实现中以多行方式运行,它们匹配任何行的开头/结尾,而不是整个字符串。

您的惰性捕获组后跟 (?=\n--|$) 将尽早退出,这恰好是最近的换行符。

您的代码示例中的正则表达式与您问题中的正则表达式略有不同。您没有在“-- header”行之后匹配换行符,因此您的最后一个捕获组匹配使用的 header 和换行符之间的空字符串。

如果您使用问题中的正则表达式,最后一个捕获组将改为匹配“-- header”之后的第一行。

我不确定为什么它这样做,但看起来 TR1 implementation行为方式相同(尽管提到的 boost \A\z anchor 不再可用)。

关于c++ - Visual C++ 正则表达式行为与 gcc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33948167/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com