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

Warum stimmt es nicht mit dem Wert überein 4234235?

Testen Sie die Regex hier:https://regex101.com/r/A2cg2P/1Es passt.

Antworten

1 WiktorStribiżew Mar 01 2021 at 02:50

Ihr Online-Regex-Test ist falsch, da Ihr tatsächlicher Text falsch ist {"|1|":"A","|2|":"B","|37|":"4234235","|4|":"C"}. Möglicherweise sehen Sie, dass Ihr Regex nicht damit übereinstimmt .

Außerdem verwenden Sie eine ECMAScript-Regex-Variante in std::regex, aber Ihre Regex ist PCRE-konform. ECMAScript Regex unterstützt zB keinen \KMatch-Reset-Operator.

Sie brauchen eine "\|37\|":"(\d+)Regex, sehen Sie sich die Regex-Demo an . Einzelheiten :

  • "\|37\|":"- wörtlicher "|37|":"Text
  • (\d+)- Gruppe 1: eine oder mehrere Ziffern.

Sehen Sie sich die C++-Demo an :

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