- •Министерство образования и науки российской федерации
- •Обработка текстов с использованием регулярных выражений
- •305040, Г.Курск, ул. 50 лет Октября, 94. Содержание
- •Введение
- •1. Цель работы
- •2. Необходимое программное обеспечение
- •3. Теоретическая часть
- •3.1. Зачем нужны регулярные выражения
- •3.2. Регулярные выражения: что это такое?
- •3.3. Синтаксис регулярных выражений
- •3.3.1. Метасимволы
- •Значения метасимволов
- •Последовательности метасимволов
- •3.3.2. Символьные классы
- •3.3.3. Квантификаторы
- •Квантификаторы
- •3.3.4. О квантификаторах: жадных и ленивых
- •«Жадные» и «ленивые» варианты квантификаторов
- •3.3.6. Обратные ссылки
- •3.3.7. Модификаторы
- •Модификаторы
- •3.4. Как оно всё работает
- •3.5. Чего не умеют регулярные выражения
- •4. Использование библиотеки RegExpr
- •4.1. Как делается поиск подстрок
- •4.2. Как делается поиск и замена
- •5. Порядок выполнения работы
- •6. Содержание отчета
- •7. Контрольные вопросы
- •Библиографический список
- •Варианты заданий
4.2. Как делается поиск и замена
Часто регулярные выражения применяются в задачах преобразования текстов, в частности: а) замены в исходном тексте подстрок, найденных регулярным выражением, на другие подстроки; б) вставки найденных подстрок в другой текст в определенные позиции. Эти действия можно реализовать с помощью обычных строковых функций. Но удобнее использовать специальные методы класса TRegExpr:
AnsiString __fastcall Substitute(AnsiString ATemplate);
Этот метод служит для подстановки подстрок, найденных при последнем поиске, в заданные места строки ATemplate. Места подстановки отмечаются символами $0 (или $&), $1, $2, … и т.д. Вместо «$0» будет вставлена строка из Match[0], вместо «$1» – строка из Match[1], и т.д. Метод Substitute возвращает строку, полученную после подстановки. Если в строку ATemplate нужно включить обычные символы $ и \ , перед ними ставится экранирующий символ «\».
Пример:
Фрагмент программы показывает применение метода Substitute
... // входной текст AnsiString buf = "Сегодня 01.09.2011, а значит - праздник!"; // шаблон для замены AnsiString atemplate = "Дата $0: день $1, месяц $2, год $3";
// обработка регулярным выражением TRegExpr *MyRegExpr = new TRegExpr; // создаем РегЭсп // выделяем дату шаблоном '(\d{2})\.(\d{2})\.(\d{4})' // имеющим три группы: день, месяц, год MyRegExpr->Expression = "(\\d{2})\\.(\\d{2})\\.(\\d{4})";
if ( MyRegExpr->Exec( buf )) { // если поиск удачный... //...делаем замену AnsiString res = MyRegExpr->Substitute( atemplate ); cout << res; // выводим на экран } ... |
В результате будет выведено:
"Дата 01.09.2011: день 01, месяц 09, год 2011"
AnsiString __fastcall Replace(
AnsiString AInputStr, // входной текст
const AnsiString AReplaceStr // строка для замены
);
Функция заменяет в строке AInputStr все вхождения регулярного выражения на AReplaceStr, и возвращает полученную строку. Внутри она вызывает методы Exec и ExecNext.
void __fastcall Split(
AnsiString AInputStr, // входной текст
Classes::TStrings* APieces // массив «нарезок»
);
Функция режет входную строку AInputStr на помещаемые в APieces куски, разделяемые вхождениями регулярного выражения. Метод вызывает Exec и ExecNext.
Этот метод удобно использовать, для разбиения строки на отдельные поля, разделенные некой последовательностью символов (например, «;»).
Кроме перечисленных методов в библиотеке RegExpr имеются глобальные функции, выполняющие подобную работу. В ряде случаев использовать функции удобнее, чем возиться с объектом TRegExpr. Все функции принимают входным параметром регулярное выражение. Если оно содержит ошибки, функции вызывают exception, поэтому лучше их вызывать в блоке try…catch.
Функция ReplaceRegExpr возвращает текст AInputStr, в котором все вхождения регулярного выражения ARegExpr заменены на строку AReplaceStr.
AnsiString __fastcall ReplaceRegExpr(
const AnsiString ARegExpr, // шаблон регэкспа
const AnsiString AInputStr, // входной текст
const AnsiString AReplaceStr // строка для замены
);
Эту функцию удобно применять для реализации команды «найти и заменить» в текстовых редакторах.
Функция SplitRegExpr режет AInputStr на куски, разделяемые вхождением выражения ARegExpr, и помещает их в APieces.
void __fastcall SplitRegExpr(
const AnsiString ARegExpr, // шаблон регэкспа
const AnsiString AInputStr, // входной текст
Classes::TStrings* APieces // результат - массив «нарезок»
);
Функция QuoteRegExprMetaChars во входной строке AStr экранирует все символы, являющиеся по синтаксису регулярных выражений метасимволами, так, чтобы полученную строку можно было безопасно использовать внутри регулярного выражения. Например “abc$cd.(“ преобразуется в “abc\$cd\.\(“
AnsiString __fastcall QuoteRegExprMetaChars(
const AnsiString AStr // входная строка
);
Эта функция полезна для автоматического синтеза регулярного выражения на основании пользовательских данных.