Parece que no puedo hacer que mi expresión regular funcione correctamente. En un texto de varias líneas en ECMAScript esta expresión regular begin\n([\s\S]*\nend)?
coincide exactamente con lo que necesito, y I tested it here.C++ std :: regex multiline sintaxis
Cuando lo traduzco en C++, no coincide con el mismo texto.
Aquí está mi código en Visual C++ 2010:
#include <iostream>
#include <regex>
int main(int argc, char *argv[]) {
std::regex metadataBlockRegex("begin\\n([\\s\\S]*\\nend)?",
std::regex::ECMAScript);
std::string text =
"begin\n"
" 123\n"
"end\n";
std::sregex_iterator blocksBegin(text.begin(), text.end(), metadataBlockRegex);
std::sregex_iterator blocksEnd;
for (auto blockMatch = blocksBegin; blockMatch != blocksEnd; ++blockMatch) {
std::cout << (*blockMatch)[0].str();
}
return 0;
}
Esto sólo produce la salida "begin" y que esperaba que coincide con el texto completo.
Mi pregunta es: ¿qué hay de malo aquí y dónde puedo encontrar una descripción detallada de la sintaxis de los motores std::regex
y cómo manejan cadenas multilínea.
Este programa imprime todo el texto (excepto el último '\ n', que no coincide) con clang ++/libC++ – Cubbi
Esto se comporta como describe Gart en MSVC10. La nueva línea no coincide, y nada está detrás de ella. –
También imprime la cadena completa con 'boost :: regex' –