Падает regex_search
От: dosik Россия www.dosik.ru
Дата: 24.11.15 01:40
Оценка:
Читаю из файлика (не большой, около 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)."
Кто-нибудь встречался с таким?
Re: Падает regex_search
От: johny5 Новая Зеландия
Дата: 24.11.15 03:17
Оценка:
Здравствуйте, dosik, Вы писали:

D>Читаю из файлика (не большой, около 2 кб) XML, а потом пытаюсь его парсить следующим образом:

D>
D>    std::smatch match;
D>    if (!std::regex_search(xml, match, std::regex("<TAG>((.|\n)*)</TAG>")))
D>        return;

D>    string section(match.str(1));
D>

D>но вот при работе regex_search выскакивает исключение аля: "Необработанное исключение по адресу 0x00DAE8C7 в test.exe: 0xC00000FD: Stack overflow (параметры: 0x00000001, 0x000B2F78)."
D>Кто-нибудь встречался с таким?

Беглый ответ: Походу регексп вышел рекурсивненький. Не нужно ли там делать escape symbols на всякие специальные символы типа <>/? Попробуй звёздочку сделать less greedy. В конце концов посмотри что со стеком, может он и правда маленький.
Re: Падает regex_search
От: uzhas Ниоткуда  
Дата: 24.11.15 07:25
Оценка:
Здравствуйте, dosik, Вы писали:

D>Кто-нибудь встречался с таким?


какая студия используется? помню, баги были на regex
тут можно поискать по слову regex : http://blogs.msdn.com/b/vcblog/archive/2012/06/15/10320846.aspx
Re[2]: Падает regex_search
От: dosik Россия www.dosik.ru
Дата: 24.11.15 08:34
Оценка:
Здравствуйте, uzhas, Вы писали:

U>какая студия используется? помню, баги были на regex


Да в том то и дело, что последняя 2015.

Ща попробую прикола ради на clang с тем же файлом проверить.
Re[2]: Падает regex_search
От: dosik Россия www.dosik.ru
Дата: 24.11.15 08:44
Оценка:
Здравствуйте, johny5, Вы писали:


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.

Да куда уж мене жадной, если надо все от тага до дага. Буду думать.
Re[3]: Падает regex_search
От: tdiff  
Дата: 24.11.15 08:53
Оценка:
Здравствуйте, dosik, Вы писали:

J>>Не нужно ли там делать escape symbols на всякие специальные символы типа <>/? Попробуй звёздочку сделать less greedy.

D>Да куда уж мене жадной, если надо все от тага до дага. Буду думать.

<tag><tag></tag></tag>

Под тот регексп подойдёт внешний tag. Кажется, не это вы хотели получить.

https://regex101.com/r/qM3nT3/1
Re[4]: Падает regex_search
От: dosik Россия www.dosik.ru
Дата: 24.11.15 09:19
Оценка:
Здравствуйте, tdiff, Вы писали:

T>https://regex101.com/r/qM3nT3/1


Так говорим практически об одном и том же. Вот мой первоначальный reg:
https://regex101.com/r/kI5kM9/1
Re: Падает regex_search
От: dosik Россия www.dosik.ru
Дата: 24.11.15 10:35
Оценка: 4 (1)
Здравствуйте, dosik, Вы писали:

Вот такой код:
try {
    if (!std::regex_search(xml, std::regex("<TAG>(.|\n)*</TAG>")))
        return;
}
catch (const std::regex_error& e)
{
    string a(e.what());
}

Вернул это сообщение:
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 справляется на ура. Видать не до конца еще доработали библиотечку.
Пойду обратно к финдам и тримам
Re[2]: Падает regex_search
От: johny5 Новая Зеландия
Дата: 24.11.15 11:23
Оценка:
Здравствуйте, dosik, Вы писали:

D>Видимо многовато для него 1800 символов при наличии (.|\n)* и не самая лучшая была идея парсить XML файлы регулярками.

D>Хотя тот же regex101.com справляется на ура. Видать не до конца еще доработали библиотечку.
D>Пойду обратно к финдам и тримам

Ну возьми оригинальный boost::regexp или xpressive.
Re[5]: Падает regex_search
От: tdiff  
Дата: 24.11.15 11:28
Оценка:
Здравствуйте, dosik, Вы писали:

D>Здравствуйте, tdiff, Вы писали:


T>>https://regex101.com/r/qM3nT3/1


D>Так говорим практически об одном и том же. Вот мой первоначальный reg:

D>https://regex101.com/r/kI5kM9/1

А можно посмотреть, какие на самом деле данные парсятся?
Re[6]: Падает regex_search
От: dosik Россия www.dosik.ru
Дата: 24.11.15 11:44
Оценка:
Здравствуйте, tdiff, Вы писали:


T>А можно посмотреть, какие на самом деле данные парсятся?

Да примерно такие и парсятся, не больше, не меньше:
<section1>
    <tag1>value1</tag1>
    <tag2>value2</tag2>
    ...
    <tagN>valueN</tagN>
</section1>
<section2>
...
Re[3]: Падает regex_search
От: dosik Россия www.dosik.ru
Дата: 24.11.15 11:45
Оценка:
Здравствуйте, johny5, Вы писали:

J>Ну возьми оригинальный boost::regexp или xpressive.


Да не, не люблю boost. Тащить с собой столько ради того, чтобы распарить файлик в 2КБ, быстрее самому написать)))
Re[7]: Падает regex_search
От: tdiff  
Дата: 24.11.15 11:48
Оценка:
Здравствуйте, dosik, Вы писали:

D>Здравствуйте, tdiff, Вы писали:



T>>А можно посмотреть, какие на самом деле данные парсятся?

D>Да примерно такие и парсятся, не больше, не меньше:
D>
D><section1>
D>    <tag1>value1</tag1>
D>    <tag2>value2</tag2>
D>    ...
D>    <tagN>valueN</tagN>
D></section1>
D><section2>
D>...
D>


tagN это какая-то уникальная строка на весь файл?
Re[8]: Падает regex_search
От: dosik Россия www.dosik.ru
Дата: 24.11.15 12:13
Оценка:
Здравствуйте, tdiff, Вы писали:


T>tagN это какая-то уникальная строка на весь файл?


Это был просто банальный пример.
Там даже названия другие.
Re[9]: Падает regex_search
От: tdiff  
Дата: 24.11.15 12:18
Оценка:
Здравствуйте, dosik, Вы писали:

D>Здравствуйте, tdiff, Вы писали:



T>>tagN это какая-то уникальная строка на весь файл?


D>Это был просто банальный пример.

D>Там даже названия другие.

В общем, хотел предупредить о том, что если эти теги неуникальные в файле, то распарсить xml таким regexp не получится из-за жадности *.
Надеюсь, это и без меня было понятно.
Re[10]: Падает regex_search
От: dosik Россия www.dosik.ru
Дата: 24.11.15 14:12
Оценка:
Здравствуйте, tdiff, Вы писали:

T>В общем, хотел предупредить о том, что если эти теги неуникальные в файле, то распарсить xml таким regexp не получится из-за жадности *.

T>Надеюсь, это и без меня было понятно.

Спасибо, но был в курсе.
Для этого есть итераторы и вот такой приемчик: <tag>([^>]*)</tag>
Еще перед можно делить на секции. И тогда все прекрасно парсится даже при повторении тэгов (например массивы).
Отредактировано 24.11.2015 14:13 dosik . Предыдущая версия .
Re: Падает regex_search
От: c-smile Канада http://terrainformatica.com
Дата: 24.11.15 18:31
Оценка: -1
Здравствуйте, dosik, Вы писали:

D>Кто-нибудь встречался с таким?


http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags
Re[4]: Падает regex_search
От: johny5 Новая Зеландия
Дата: 24.11.15 20:53
Оценка:
Здравствуйте, dosik, Вы писали:

D>Здравствуйте, johny5, Вы писали:


J>>Ну возьми оригинальный boost::regexp или xpressive.


D>Да не, не люблю boost. Тащить с собой столько ради того, чтобы распарить файлик в 2КБ, быстрее самому написать)))


2КБ тут, 2КБ там.. Как знаешь. Зато мой любимчик xpressive могёт и рекурсивные грамматики, мощности должно хватить разложить XML.
Re[2]: Падает regex_search
От: dosik Россия www.dosik.ru
Дата: 25.11.15 00:46
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags

По улыбался )))
Хотя от части он прав.
Сейчас ужа использую регулярки для отделения в котлетах мяса от мух (тагов от значений), а вот более серьезную работу все равно пришлось ручками.
Такая вот у меня смесь SAX и DOM.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.