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;
}

Kenapa nilainya tidak sesuai 4234235?

Menguji regex di sini:https://regex101.com/r/A2cg2P/1Itu cocok.

Jawaban

1 WiktorStribiżew Mar 01 2021 at 02:50

Tes regex online Anda salah karena teks Anda yang sebenarnya {"|1|":"A","|2|":"B","|37|":"4234235","|4|":"C"}, Anda mungkin melihat bahwa regex Anda tidak cocok .

Selain itu, Anda menggunakan rasa regex ECMAScript di std::regex, tetapi regex Anda sesuai dengan PCRE. Misalnya ECMAScript regex tidak mendukung \Koperator reset kecocokan.

Anda memerlukan "\|37\|":"(\d+)regex, lihat demo regex . rincian :

  • "\|37\|":""|37|":"- teks literal
  • (\d+)- Grup 1: satu atau lebih digit.

Lihat 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;
}