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;
}
Perché non corrisponde al valore 4234235?
Testare la regex qui:https://regex101.com/r/A2cg2P/1Corrisponde.
Risposte
1  WiktorStribiżew Mar 01 2021 at 02:50
La tua regex test online è sbagliata perché il tuo testo reale è {"|1|":"A","|2|":"B","|37|":"4234235","|4|":"C"}, potresti vedere che la tua regex non corrisponde .
Inoltre, stai utilizzando un'espressione regolare ECMAScript in std::regex, ma la tua espressione regolare è conforme a PCRE. Ad esempio, l'espressione regolare ECMAScript non supporta \Kl'operatore di reimpostazione della corrispondenza.
Hai bisogno di una "\|37\|":"(\d+)regex, guarda la demo regex . Dettagli :
- "\|37\|":"- "|37|":"- testo letterale
- (\d+)- Gruppo 1: una o più cifre.
Guarda la demo 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;
}