Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы СПО / РегЭкспы методичка.docx
Скачиваний:
54
Добавлен:
12.04.2015
Размер:
254.09 Кб
Скачать

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, поэтому лучше их вызывать в блоке trycatch.

Функция 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 // входная строка

);

Эта функция полезна для автоматического синтеза регулярного выражения на основании пользовательских данных.

Соседние файлы в папке Лабы СПО