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

Tại sao nó không khớp với giá trị 4234235?

Kiểm tra regex tại đây: https://regex101.com/r/A2cg2P/1 Nó phù hợp.

Trả lời

1 WiktorStribiżew Mar 01 2021 at 02:50

Kiểm tra regex trực tuyến của bạn là sai bởi vì văn bản thực tế của bạn là {"|1|":"A","|2|":"B","|37|":"4234235","|4|":"C"}, bạn có thể thấy rằng regex của bạn không khớp với nó .

Ngoài ra, bạn đang sử dụng hương vị regex ECMAScript std::regex, nhưng regex của bạn tuân thủ PCRE. Ví dụ: ECMAScript regex không hỗ trợ \Ktoán tử thiết lập lại khớp.

Bạn cần một "\|37\|":"(\d+)regex, hãy xem bản demo regex . Chi tiết :

  • "\|37\|":"- "|37|":"văn bản chữ
  • (\d+) - Nhóm 1: một hoặc nhiều chữ số.

Xem bản trình diễn 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;
}