Regex_search c ++
#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
実際のテキストが{"|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;
}