Страница 1 из 1
Регулярные выражения в С++
Добавлено: 31 май 2010, 18:54
Dragon
Обыскал все и вся, но ничего толкового не нашел.
Есть ли в С++ возможность проверки регулярных выражений штатными средствами? Или только из библиотеки Boost?
С boost дел не имел. Для его использования нужно подключать какие-то заголовочные файлы или что-то скачивать и устанавливать?
Задача проанализировать текстовый файл на наличие разных тегов (пусть это будут html теги). Результаты будут записываться в другой файл. Какие-то теги нужно просто будет удалить, а где-то удалить все содержимое от тега до тега включительно (например: [table]....[/table]).
Не знаю как подойти к данному вопросу:
- писать много проверок (case, if) анализируя каждую строчку файла и вычищая все ненужное (разновидностей тегов хватает - порядка 20-30);
- использовать какие-либо средства (желательно штатные, если они есть) для анализа этих же самых строк, но уже с помощью регулярных выражений.
Re: Регулярные выражения в С++
Добавлено: 31 май 2010, 22:00
WinMain
Упрощённый вариант регулярных выражений для Visual С++ есть в библиотеке ATL (заголовочный файл atlrx.h). Описание имеется в MSDN (шаблон CAtlRegExp).
Re: Регулярные выражения в С++
Добавлено: 01 июн 2010, 12:15
Vasilisk
Dragon писал(а):Обыскал все и вся, но ничего толкового не нашел.
Есть ли в С++ возможность проверки регулярных выражений штатными средствами? Или только из библиотеки Boost?
С boost дел не имел. Для его использования нужно подключать какие-то заголовочные файлы или что-то скачивать и устанавливать?
В С++ кроме языка нет никаких "штатных средств" - не бейсик. Все возможности бОльшие просто языка обеспечиваются какими-либо заранее приготовленными шаблонами, библиотеками и проч. Часть из них поставляется вместе с компилятором, другие части можно найти отдельно. Выше давались советы, какие именно. В любом случае "надо подключать заголовочные файлы", даже для тех средств, что поставляются вместе со средой программирования - язык так устроен.
Boost - де-факто "универсальное общепринятое средство эффективных алгоритмов", поэтому его использование - нормальное решение не "по-колхозному".
Написать регулярное выражение выполняющее сложную работу - задача более трудная, чем "написать много строк if", поэтому, если нужно быстро и всё равно как на один раз - лучше писать "много if". Если нужно хорошо и с возможностью поддержки в будущем - лучше писать с использованием регулярных выражений.
С++ не лучший язык для написания такой программы. Если нет специальных требований, вынуждающих выбирать именно C++, то на Перле такая программа делается быстрее, надёжнее в работе и методологически правильнее. Более того, наверное и решение на C++ надо было бы писать именно так - сначала сделать прототип на Перле, отладить в этом прототипе регулярные выражения выполняющие разбор, а потом просто переписать прототип на С++. Это будет быстрее для получения правильного результата.
Re: Регулярные выражения в С++
Добавлено: 01 июн 2010, 16:05
Dragon
Перл я к сожалению не знаю. С Boost буду знакомиться. На данном этапе пока свой велосипде изобретаю, но это уже другая история.
Re: Регулярные выражения в С++
Добавлено: 01 июн 2010, 18:05
Vasilisk
Dragon писал(а):Перл я к сожалению не знаю. С Boost буду знакомиться. На данном этапе пока свой велосипде изобретаю, но это уже другая история.
Если вы знаете С - вы знаете и 3/4 Перла

Он много проще, чем кажется. Во всяком случае для простых скриптов. И дока на него, та, что идёт в комплекте с ActivePerl, по меньшей мере, составлена очень толково. В вашем случае вам нужно прочитать всего два раздела этой доки - ввод-вывод (из файлов) и регулярные выражения. А удобство отладки самих шаблонов регулярных выражений в нём - выше всяких похвал. Минимум вспомогательных действий.
Re: Регулярные выражения в С++
Добавлено: 01 июн 2010, 19:02
WinMain
Регулярные выражения - это инструмент, которым обладают преимущественно скриптовые языки. К ним можно так же добавить VBScript и JavaScript. Ещё библиотека регулярных выражений есть в платформах .NET и Java. В библиотеке Qt для С++ есть тоже классы для работы с регулярными выражениями.