我在MSVC 2013中使用std :: regex解析了一段类似xml的代码
private string errorMessage;
public string ErrorMessage
{
get { return errorMessage; }
set
{
errorMessage = value;
NotifyPropertyChanged("ErrorMessage");
}
}
以下是模式:
<GLVertex>
#version 450 core
layout(location = 0) in vec3 pos;
in VertexInfo{
vec2 uv;
}vertexInfo;
void main(){
gl_Position = vec4(pos, 1.0);
vertexInfo.uv = pos.xy;
}
<GLVertex/>
<GLFragment>
#version 450 core
layout(location = 0) uniform sampler2D g_map;
uniform Color {
vec4 color;
};
layout(location = 0) out vec4 fragColor;
void main(){
fragColor = texture(g_map, vertexInfo.uv);
}
<GLFragment/>
但程序总是崩溃!我的正则表达式中有没有错误?我在regex101上测试过。
PS。当我删除第5行时:
<GLVertex>((.|\n)+)<GLVertex\/>
它运作正常!
答案 0 :(得分:1)
由于模式效率不高,您会收到Stack overflow (parameters: 0x00000001, 0x00312FFC)
个异常。我认为这与std::regex
如何处理重复的组(您已使用+
- 量词组(.|\n)+
定义一个)有关。此模式匹配不是换行符(.
)或换行符(\n
)的每个字符,然后将匹配项存储在缓冲区中。然后,迭代器调试的问题仅在 Debug 模式中发生。 std::_Orphan_Me
是发生中断的地方,在匹配字符串时它被认为是最“昂贵”的方法。见performance killer -Debug Iterator Support in Visual studio
您应该切换到 Release 模式,或者使用不需要使用重复组的正则表达式进行测试,例如任何非空字符 {{ 1}}使用延迟量词[^\x00]
:
*?