Esto es un error en la implementación de libstdC++. Mira estas:
#include <string>
#include <regex>
#include <boost/regex.hpp>
#include <iostream>
int main() {
{
using namespace std;
regex my_r("(.*)(6)(.*)");
smatch m;
if (regex_match(std::string{"123456789"}, m, my_r)) {
std::cout << m.length(1) << ", "
<< m.length(2) << ", "
<< m.length(3) << std::endl;
}
}
{
using namespace boost;
regex my_r("(.*)(6)(.*)");
smatch m;
if (regex_match(std::string{"123456789"}, m, my_r)) {
std::cout << m.length(1) << ", "
<< m.length(2) << ", "
<< m.length(3) << std::endl;
}
}
return 0;
}
Si se compila con gcc, el primero (libstdC++) devuelve el resultado totalmente equivocado 9, -2, 4 y el segundo (aplicación del impulso) devuelve 5, 1, 3 como se esperaba.
Si compila con clang + libC++, su código funciona bien.
(Tenga en cuenta que libstdC++ 's aplicación de expresiones regulares es solamente 'parcialmente apoyado', como se describe en http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52719.)
tenga en cuenta que la compatibilidad con la implementación de expresiones regulares todavía es muy baja en gcc y MSVC, probablemente también. – inf
gracias, estoy usando gcc 4.6.3. –
Actualicé a g ++ 4.7, pero igual salida. Todavía creo que esto es un malentendido de expresiones regulares de mi parte. Con demasiada frecuencia he culpado al software por mis propios errores en el pasado. –