Regex_search c++
#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
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' \K
opé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; }