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: одна или несколько цифр.
См. Демонстрацию 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;
}