Читаю из файлика (не большой, около 2 кб) XML, а потом пытаюсь его парсить следующим образом:
std::smatch match;
if (!std::regex_search(xml, match, std::regex("<TAG>((.|\n)*)</TAG>")))
return;
string section(match.str(1));
но вот при работе regex_search выскакивает исключение аля: "Необработанное исключение по адресу 0x00DAE8C7 в test.exe: 0xC00000FD: Stack overflow (параметры: 0x00000001, 0x000B2F78)."
Кто-нибудь встречался с таким?
D>но вот при работе regex_search выскакивает исключение аля: "Необработанное исключение по адресу 0x00DAE8C7 в test.exe: 0xC00000FD: Stack overflow (параметры: 0x00000001, 0x000B2F78)." D>Кто-нибудь встречался с таким?
Беглый ответ: Походу регексп вышел рекурсивненький. Не нужно ли там делать escape symbols на всякие специальные символы типа <>/? Попробуй звёздочку сделать less greedy. В конце концов посмотри что со стеком, может он и правда маленький.
J>Беглый ответ: Походу регексп вышел рекурсивненький.
Да. Вы правы, реккурсия. В стеке сплошные:
test.exe!std::_Matcher<std::_String_const_iterator<std::_String_val<std::_Simple_types<char> > >,char,std::regex_traits<char>,std::_String_const_iterator<std::_String_val<std::_Simple_types<char> > > >::_Match_pat(std::_Node_base * _Nx)Строка 4567 C++
J>Не нужно ли там делать escape symbols на всякие специальные символы типа <>/? Попробуй звёздочку сделать less greedy.
Да куда уж мене жадной, если надо все от тага до дага. Буду думать.
Здравствуйте, dosik, Вы писали:
J>>Не нужно ли там делать escape symbols на всякие специальные символы типа <>/? Попробуй звёздочку сделать less greedy. D>Да куда уж мене жадной, если надо все от тага до дага. Буду думать.
<tag><tag></tag></tag>
Под тот регексп подойдёт внешний tag. Кажется, не это вы хотели получить.
Вернул это сообщение:
regex_error(error_stack): There was insufficient memory to determine whether the regular expression could match the specified character sequence.
Видимо многовато для него 1800 символов при наличии (.|\n)* и не самая лучшая была идея парсить XML файлы регулярками.
Хотя тот же regex101.com справляется на ура. Видать не до конца еще доработали библиотечку.
Пойду обратно к финдам и тримам
Здравствуйте, dosik, Вы писали:
D>Видимо многовато для него 1800 символов при наличии (.|\n)* и не самая лучшая была идея парсить XML файлы регулярками. D>Хотя тот же regex101.com справляется на ура. Видать не до конца еще доработали библиотечку. D>Пойду обратно к финдам и тримам
Ну возьми оригинальный boost::regexp или xpressive.
Здравствуйте, dosik, Вы писали:
D>Здравствуйте, tdiff, Вы писали:
T>>tagN это какая-то уникальная строка на весь файл?
D>Это был просто банальный пример. D>Там даже названия другие.
В общем, хотел предупредить о том, что если эти теги неуникальные в файле, то распарсить xml таким regexp не получится из-за жадности *.
Надеюсь, это и без меня было понятно.
Здравствуйте, tdiff, Вы писали:
T>В общем, хотел предупредить о том, что если эти теги неуникальные в файле, то распарсить xml таким regexp не получится из-за жадности *. T>Надеюсь, это и без меня было понятно.
Спасибо, но был в курсе.
Для этого есть итераторы и вот такой приемчик: <tag>([^>]*)</tag>
Еще перед можно делить на секции. И тогда все прекрасно парсится даже при повторении тэгов (например массивы).
Здравствуйте, dosik, Вы писали:
D>Здравствуйте, johny5, Вы писали:
J>>Ну возьми оригинальный boost::regexp или xpressive.
D>Да не, не люблю boost. Тащить с собой столько ради того, чтобы распарить файлик в 2КБ, быстрее самому написать)))
2КБ тут, 2КБ там.. Как знаешь. Зато мой любимчик xpressive могёт и рекурсивные грамматики, мощности должно хватить разложить XML.