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

값과 일치하지 않는 이유는 무엇 4234235입니까?

여기에서 정규식 테스트: https://regex101.com/r/A2cg2P/1 그것은 일치합니다.

답변

1 WiktorStribiżew Mar 01 2021 at 02:50

실제 텍스트가 이므로 온라인 정규식 테스트가 잘못되었습니다 . {"|1|":"A","|2|":"B","|37|":"4234235","|4|":"C"}정규식 이 일치하지 않는 것을 볼 수 있습니다 .

게다가 에서 ECMAScript 정규식 풍미를 사용 std::regex하고 있지만 정규식은 PCRE와 호환됩니다. 예를 들어 ECMAScript 정규식은 \K일치 재설정 연산자를 지원하지 않습니다 .

"\|37\|":"(\d+)정규식 이 필요합니다 . 정규식 데모를 참조 하세요 . 세부사항 :

  • "\|37\|":"- 리터럴 "|37|":"텍스트
  • (\d+) - 그룹 1: 하나 이상의 숫자.

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