【问题标题】:Visual C++ regex behaviour vs gccVisual C++ 正则表达式行为与 gcc
【发布时间】:2015-11-26 23:00:31
【问题描述】:

我想从一个文件中提取多个 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]*?) 应该与着色器的主体相匹配。由于Regex Working on regexr but not Visual Studio,我将\r\n 包括在内。

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

我的问题在于 Visual Studio 2015,其中最后一次捕获仅匹配一个空字符串(其他捕获工作)。

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

【问题讨论】:

  • 你可能需要在 C 认为特别的东西上转义反斜杠。因此,将 \r\n 放入 C 字符串的正则表达式将是 x = "\\r\\n"
  • @JerryJeremiah 原始字符串文字 R"(...)" 允许您编写字符串而无需转义任何内容。

标签: c++ regex visual-studio visual-studio-2015


【解决方案1】:

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

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

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

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

我不确定 为什么 它会这样做,但似乎 TR1 implementation 的行为方式相同(尽管提到的提升 \A\z 锚不再可用) .

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-04
  • 1970-01-01
  • 1970-01-01
  • 2011-11-27
  • 1970-01-01
相关资源
最近更新 更多