Regex_search c++

Mar 01 2021
#include <iostream>
#include <regex>

int main() {

    std::string s = "{\"|1|\":\"A\",\"|2|\":\"B\",\"|37|\":\"4234235\",\"|4|\":\"C\"}";

    std::regex regex("37\\|\\\\\":\\\\\"\\K\\d*");

    std::smatch m;

    regex_search(s, m, regex);
    std::cout << "match: " << m.str(1) << std::endl;

    return 0;
}

Pourquoi ne correspond-il pas à la valeur 4234235?

Tester la regex ici :https://regex101.com/r/A2cg2P/1Ça correspond.

Réponses

1 WiktorStribiżew Mar 01 2021 at 02:50

Votre test de regex en ligne est faux parce que votre texte réel l'est {"|1|":"A","|2|":"B","|37|":"4234235","|4|":"C"}, vous pouvez voir que votre regex ne correspond pas à celui-ci .

De plus, vous utilisez une saveur de regex ECMAScript dans std::regex, mais votre regex est conforme à PCRE. Par exemple, l'expression régulière ECMAScript ne prend pas en charge l' \Kopérateur de réinitialisation de correspondance.

Vous avez besoin d'une "\|37\|":"(\d+)regex, voir la démo regex . Détails :

  • "\|37\|":""|37|":"- texte littéral
  • (\d+)- Groupe 1 : un ou plusieurs chiffres.

Voir la démo C++ :

#include <iostream>
#include <regex>

int main() {
    std::string s = "{\"|1|\":\"A\",\"|2|\":\"B\",\"|37|\":\"4234235\",\"|4|\":\"C\"}";
    std::cout << s <<"\n";
    std::regex regex(R"(\|37\|":"(\d+))");
    std::smatch m;
    regex_search(s, m, regex);
    std::cout << "match: " << m.str(1) << std::endl;
    return 0;
}