Ho un pezzo di codice simile a xml per analizzare, usando std :: regex in MSVC 2013
#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; } #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); }
Ecco lo schema:
((.|\n)+)
Ma il programma si arresta sempre! C’è qualche bug nel mio regex? Ho provato su regex101.
PS. quando cancello la quinta linea:
vec2 uv;
funziona OK!
Si ottiene un’eccezione Stack overflow (parameters: 0x00000001, 0x00312FFC)
quanto il pattern non è efficiente. Penso che sia correlato a come std::regex
elabora gruppi ripetuti (ne hai definito uno con un gruppo +
-quantifier (.|\n)+
). Questo modello corrisponde a ogni carattere che non è una nuova riga ( .
), O una nuova riga ( \n
), e quindi memorizza la corrispondenza all’interno di un buffer. Quindi, un problema con il debug degli iteratori si verifica solo in modalità Debug . std::_Orphan_Me
è il luogo in cui si verifica l’interruzione e viene considerato il metodo più “costoso” quando si confrontano le stringhe. Vedi il servizio di prestazioni killer-Debug Iterator in Visual Studio
Dovresti passare alla modalità Release o testare con un’espressione regolare che non richiede l’uso dei gruppi ripetuti, come qualsiasi carattere non nullo [^\x00]
con quantificatore pigro *?
:
std::string str1 = "\n#version 450 core\nlayout(location = 0) in vec3 pos;\nin VertexInfo{\n vec2 uv;\n}vertexInfo;\nvoid main(){\n gl_Position = vec4(pos, 1.0);\n vertexInfo.uv = pos.xy;\n}\n \n\n#version 450 core\nlayout(location = 0) uniform sampler2D g_map;\nuniform Color {\n vec4 color;\n};\nlayout(location = 0) out vec4 fragColor;\nvoid main(){\n fragColor = texture(g_map, vertexInfo.uv);\n}\n "; std::regex reg1("([^\\x00]*?) "); std::smatch find1; if (std::regex_search(str1, find1, reg1)){ std::cout << find1[1].str(); }