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