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?

ทดสอบ regex ที่นี่:https://regex101.com/r/A2cg2P/1มันไม่ตรงกัน

คำตอบ

1 WiktorStribiżew Mar 01 2021 at 02:50

การทดสอบ regex ออนไลน์ของคุณไม่ถูกต้อง เนื่องจากข้อความจริงของคุณคือ{"|1|":"A","|2|":"B","|37|":"4234235","|4|":"C"}คุณอาจเห็นว่า regex ของคุณไม่ตรงกัน

นอกจากนี้ คุณกำลังใช้ ECMAScript regex รสในstd::regexแต่ regex ของคุณเป็นไปตาม PCRE เช่น ECMAScript regex ไม่รองรับ\Kตัวดำเนินการรีเซ็ตการจับคู่

คุณต้องมี"\|37\|":"(\d+)regex ดูการสาธิต regex รายละเอียด :

  • "\|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;
}