Механизм обработки регулярных выражений находится в модуле System.RegularExpressions и состоит из одного класса и двух записей (не считая служебных компонентов).
- TRegEx – (класс) собственно обработка регулярного выражения;
- TMatch – (запись) представление единичного результата обработки;
- TMatchCollection – (запись) коллекция результатов обработки (TMatch). Используется, если предполагается, что в тексте может быть несколько фрагментов соответствующих данному регулярному выражению.
Создание объекта для обработки регулярного выражения
Допустим, есть простенькое регулярное выражение для проверки адреса сайта расположенного на домене второго уровня.
1 2 |
const Pattern = 'https://\w+\.\w+/'; |
Для того чтобы создать экземпляр класса TRegEx, который будет работать с ним, необходимо передать это выражение в качестве параметра конструктора.
1 |
RegEx:=TRegEx.Create(Pattern); |
Важно отметить, что регулярное выражение, с которым будет работать данный объект впоследствии невозможно изменить. Для работы с другим регулярным выражением потребуется создание другого объекта.
После того как объект для обработки регулярного выражения создан можно перейти к решению прикладных задач. Например, поиску соответствий или замене фрагментов текста.
Поиск соответствий
Поиск единичного совпадения осуществляется достаточно просто.
Для этого требуется передать анализируемую строку в качестве параметра метода Match, и он вернёт значение типа TMatch, если в ней имеется соответствие. При этом найденный текст будет доступен через поле Value TMatch.
1 2 |
Match := RegEx.Match(SourceMemo.Text); ResultMemo.Text:=Match.Value; |
Если соответствий в тексте может быть несколько, то способ реализации зависит от конкретной задачи.
Если требуется просто найти самое первое (от начала строки) соответствие, можно также воспользоваться методом Match. Он корректно отработает и при наличии нескольких соответствий, но возвратит только самое первое из них. В противном случае следует использовать метод Matches и работать с TMatchCollection,
Вызов метода Matches аналогичен методу Match.
Каждое найденное соответствие будет доступно в качестве элемента коллекции (TMatch) TMatchCollection.
1 2 3 4 |
MatchCollection := RegEx.Matches(SourceMemo.Text); // Обход коллекции результатов обработки регулярного выражения for i := 0 to MatchCollection.Count - 1 do ResultMemo.Lines.Add(MatchCollection.Item[i].Value); |
Помимо вышеописанных задач при поиске соответствий может потребовать даже не сам поиск конкретных результатов, а лишь подтверждение их наличия.
Для этого служит метод IsMatch класса TRegEx. В случае наличия в анализируемой строке хотя бы одного соответствия регулярному выражению данный метод возвратит true. Также как и в предыдущих случаях, анализируемая строка передаётся в качестве параметра.
1 2 |
if RegEx.IsMatch(SourceMemo.Text) then // Делаем что-то |
Замена фрагментов текста по регулярному выражению
Для замены фрагментов текста по регулярному выражению служит метод Replase класса TRegEx. Он принимает два строковых аргумента: анализируемую строку и строку, на которую будут заменены все соответствия данному регулярному выражению.
В примере ниже все найденные в исходной строке адреса сайтов на домене второго уровня будут заменены текстом «<здесь был адрес сайта>».
1 |
ResultMemo.Text:=RegEx.Replace(SourceMemo.Text,'<здесь был адрес сайта>'); |
Разделение строк по регулярному выражению
Класс TRegEx поддерживает разделение строки с использованием регулярного выражения для поиска мест разделения.
Разделение осуществляется при помощи метода Split, который имеет несколько перегрузок. Наиболее простая из них принимает в качестве параметра только анализируемую строку. Данный метод возвращает массив разделённых строк в формате TArray<string>.
Однако работа этого метода имеет одну особенность. Он не всегда корректно обрабатывает пробелы и управляющие символы. Поэтому перед дальнейшим использованием строк, полученных в результате, может потребоваться удаление лишних символов при помощи функции Trim.
Ниже приведён пример разделения строк по регулярному выражению с использованием функции Trim.
1 2 3 |
SplittedStrings := RegEx.Split(SourceMemo.Text); for i := 0 to Length(SplittedStrings) - 1 do ResultMemo.Lines.Add(Trim(SplittedStrings[i])); |
Несмотря на все неудобства стандартные средства Delphi для работы с регулярными выражениями, всё же в состоянии решать весь спектр задач связанных с ними. Это позволяет снять необходимость использования сторонних библиотек, а также «изобретения велосипедов». Что в немалой степени облегчает труд разработчика.
Добавить комментарий