Регулярные выражения в С++

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Dragon
Сообщения: 99
Зарегистрирован: 01 окт 2009, 11:21
Откуда: Odessa
Контактная информация:

Обыскал все и вся, но ничего толкового не нашел.
Есть ли в С++ возможность проверки регулярных выражений штатными средствами? Или только из библиотеки Boost?

С boost дел не имел. Для его использования нужно подключать какие-то заголовочные файлы или что-то скачивать и устанавливать?

Задача проанализировать текстовый файл на наличие разных тегов (пусть это будут html теги). Результаты будут записываться в другой файл. Какие-то теги нужно просто будет удалить, а где-то удалить все содержимое от тега до тега включительно (например: [table]....[/table]).

Не знаю как подойти к данному вопросу:
- писать много проверок (case, if) анализируя каждую строчку файла и вычищая все ненужное (разновидностей тегов хватает - порядка 20-30);
- использовать какие-либо средства (желательно штатные, если они есть) для анализа этих же самых строк, но уже с помощью регулярных выражений.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Упрощённый вариант регулярных выражений для Visual С++ есть в библиотеке ATL (заголовочный файл atlrx.h). Описание имеется в MSDN (шаблон CAtlRegExp).
Vasilisk
Сообщения: 116
Зарегистрирован: 13 фев 2004, 18:43

Dragon писал(а):Обыскал все и вся, но ничего толкового не нашел.
Есть ли в С++ возможность проверки регулярных выражений штатными средствами? Или только из библиотеки Boost?

С boost дел не имел. Для его использования нужно подключать какие-то заголовочные файлы или что-то скачивать и устанавливать?
В С++ кроме языка нет никаких "штатных средств" - не бейсик. Все возможности бОльшие просто языка обеспечиваются какими-либо заранее приготовленными шаблонами, библиотеками и проч. Часть из них поставляется вместе с компилятором, другие части можно найти отдельно. Выше давались советы, какие именно. В любом случае "надо подключать заголовочные файлы", даже для тех средств, что поставляются вместе со средой программирования - язык так устроен.

Boost - де-факто "универсальное общепринятое средство эффективных алгоритмов", поэтому его использование - нормальное решение не "по-колхозному".

Написать регулярное выражение выполняющее сложную работу - задача более трудная, чем "написать много строк if", поэтому, если нужно быстро и всё равно как на один раз - лучше писать "много if". Если нужно хорошо и с возможностью поддержки в будущем - лучше писать с использованием регулярных выражений.

С++ не лучший язык для написания такой программы. Если нет специальных требований, вынуждающих выбирать именно C++, то на Перле такая программа делается быстрее, надёжнее в работе и методологически правильнее. Более того, наверное и решение на C++ надо было бы писать именно так - сначала сделать прототип на Перле, отладить в этом прототипе регулярные выражения выполняющие разбор, а потом просто переписать прототип на С++. Это будет быстрее для получения правильного результата.
Dragon
Сообщения: 99
Зарегистрирован: 01 окт 2009, 11:21
Откуда: Odessa
Контактная информация:

Перл я к сожалению не знаю. С Boost буду знакомиться. На данном этапе пока свой велосипде изобретаю, но это уже другая история.
Vasilisk
Сообщения: 116
Зарегистрирован: 13 фев 2004, 18:43

Dragon писал(а):Перл я к сожалению не знаю. С Boost буду знакомиться. На данном этапе пока свой велосипде изобретаю, но это уже другая история.

Если вы знаете С - вы знаете и 3/4 Перла :) Он много проще, чем кажется. Во всяком случае для простых скриптов. И дока на него, та, что идёт в комплекте с ActivePerl, по меньшей мере, составлена очень толково. В вашем случае вам нужно прочитать всего два раздела этой доки - ввод-вывод (из файлов) и регулярные выражения. А удобство отладки самих шаблонов регулярных выражений в нём - выше всяких похвал. Минимум вспомогательных действий.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Регулярные выражения - это инструмент, которым обладают преимущественно скриптовые языки. К ним можно так же добавить VBScript и JavaScript. Ещё библиотека регулярных выражений есть в платформах .NET и Java. В библиотеке Qt для С++ есть тоже классы для работы с регулярными выражениями.
Ответить