std :: regex_match e quantificador lento com comportamento estranho

Eu sei disso:
Correspondências preguiçosas do quantificador: o menos possível (correspondência mais curta)

Saiba também que o construtor:

basic_regex( ...,
            flag_type f = std::regex_constants::ECMAScript );

E:
ECMAScript suportanão ganancioso fósforos,
e aECMAScript regex"<tag[^>]*>.*?</tag>"
corresponderia apenas até oprimeiro tag de fechamento ...en.cppreference

E:
No máximo, uma opção gramatical deve ser escolhida dentreECMAScript, basic, extended, awk, grep, egrep. Se nenhuma gramática for escolhida,ECMAScript é assumido como selecionado ...en.cppreference

E:
Observe queregex_match corresponderá apenas com êxito a uma expressão regular a uma sequência de caracteres inteira, enquantostd::regex_search corresponderá com êxito às subsequências ...std :: regex_match

Aqui está o meu código:Viver

#include <iostream>
#include <string>
#include <regex>

int main(){

        std::string string( "s/one/two/three/four/five/six/g" );
        std::match_results< std::string::const_iterator > match;
        std::basic_regex< char > regex ( "s?/.+?/g?" );  // non-greedy
        bool test = false;

        using namespace std::regex_constants;

        // okay recognize the lazy operator .+?
        test = std::regex_search( string, match, regex );
        std::cout << test << '\n';
        std::cout << match.str() << '\n';
        // does not recognize the lazy operator .+?
        test = std::regex_match( string, match, regex, match_not_bol | match_not_eol );
        std::cout << test << '\n';
        std::cout << match.str() << '\n';
} 

e a saída:

1
s/one/
1
s/one/two/three/four/five/six/g

Process returned 0 (0x0)   execution time : 0.008 s
Press ENTER to continue.

std::regex_match não deve corresponder a nada e deve retornar0 comnão ganancioso quantificador.+?

De fato, aqui, onão ganancioso .+? quantificador tem o mesmo significado queávido um e ambos/.+?/ e/.+/ coincidir com a mesma string. Eles são padrões diferentes.Portanto, o problema é por que o ponto de interrogação é ignorado?

regex101

Teste rápido:

$ echo 's/one/two/three/four/five/six/g' | perl -lne '/s?\/.+?\/g?/ && print 
$ echo 's/one/two/three/four/five/six/g' | perl -lne '/s?\/.+?\/g?/ && print $&'
$ s/one/
$
$ echo 's/one/two/three/four/five/six/g' | perl -lne '/s?\/.+\/g?/ && print $&'
$ s/one/two/three/four/five/six/g
amp;' $ s/one/ $ $ echo 's/one/two/three/four/five/six/g' | perl -lne '/s?\/.+\/g?/ && print
$ echo 's/one/two/three/four/five/six/g' | perl -lne '/s?\/.+?\/g?/ && print $&'
$ s/one/
$
$ echo 's/one/two/three/four/five/six/g' | perl -lne '/s?\/.+\/g?/ && print $&'
$ s/one/two/three/four/five/six/g
amp;' $ s/one/two/three/four/five/six/g

NOTA
este regex:std::basic_regex< char > regex ( "s?/.+?/g?" ); não ganancioso
e isto :std::basic_regex< char > regex ( "s?/.+/g?" ); ávido
tem a mesma saída comstd::regex_match. Ainda assim, ambos correspondem a toda a cadeia!
Mas comstd::regex_search tem a saída diferente.
Além dissos? oug? não importa e com/.*?/ ainda corresponde a toda a cadeia!

Mais detalhes

g++ --version
g++ (Ubuntu 6.2.0-3ubuntu11~16.04) 6.2.0 20160901

questionAnswers(1)

yourAnswerToTheQuestion