Регулярные выражения. Практика

В прошлом посте я разбирался с теорией, сейчас попробую попрактиковаться в Delphi с разными примерами из разных блогов.

Элементарно

Теперь тоже самое, но с использованием метасимволов

Что написано в последнем коде? Разберем регулярное выражение

^H  говорим машине, что в начале искомого текста (рег. выражения) должна быть большая латинская H

[\w]+ эта часть означает, что далее возможны любые буквенные или цифровые символы или знак подчеркивания

o\b – эта часть говорит машине, что в конце искомого слова должен быть символ o

Регулярные выражения без создания экземпляра класса

Трабл с русским языком

К сожалению, если написать аналогичную конструкцию с метасимволами на русском языке, то всё это удовольствие не сработает.

А вот так сработает, но это частный выход, а общий – библиотека Андрея Сорокина

Примеры посложнее

Отлавливаем email…

Этот пример я взял с сайта Игоря Антонова, мне он понравился, поэтому я решил его повторить, единственное, что я изменил в нем – расставил бэкслэши перед w и d. Далее, я цитирую Игоря

[\w-.]+ – эта часть описывает адрес электронной почты до знака собачка. В соответствии со стандартом, здесь могут быть любые буквы (w), цифры от 0-9 (d), знак «-» и точка. После описания символьного класса нужно поставить метасимвол «+», иначе под данную часть шаблона у тебя будут попадать одиночные символы.

@ – понятно, что e-mail адрес не может быть без значка собачки, поэтому нам необходимо его описать.

([\w\d-]+(.[\w-]+)+) – доменная часть e-mail адреса описывается в этом небольшом кусочке. Все используемые здесь метасимволы должны быть тебе уже известны, поэтому я не буду повторяться. Просто внимательней посмотри на эту часть и все станет на свои места.

Единственное, про что я тебе не рассказывал, так это про скобки. В регулярных выражениях они выполняют двойную роль – описывают группы литералов и сохраняют эту группу в специально предопределенных переменных. В данном выражении я буду сохранять отдельно имя домена и доменную зону.

Ищем http адреса

Далее, также цитирую Игоря Антонова


  • (http|ftp):// – опишем возможные протоколы. Любой адрес для обращения к узлу с помощью протокола http или ftp должен начинаться с http:// или ftp:// соответственно. В скобках я указываю сначала приставку http, затем вертикальную черту, которая соответствует логическому ИЛИ и уже после нее вторую возможную приставку – ftp. В итоге наш шаблон будет срабатывать как на ссылки ftp ресурсов, так и http.
  • ([wd-]+(.[wd-]+)+) – вот таким образом можно описать адрес узла. Данная конструкция будет одинаково хорошо срабатывать и на адреса вида http://192.168.0.1 – т.е. IP адрес, как и на символьные адреса. Скобками группируем условия, т.к. если просто написать диапазон литералов в одном классе и поставить метасимвол +, то выражение не будет правильно работать. Ради эксперимента советую поупражняться и попробовать составить другой шаблон.
  • (([wd-=?\./]+)+)* – поскольку линк может вести на какой-нибудь файл, то мы обязаны это предусмотреть. В пути могут присутствовать различные символы: «/», «?», «=» и т.д. Поскольку часть из них являются метасимволами, то мы должны их экранировать – поставив перед ними еще один слеш. Установив шаблон можно открывать наш файл, запускать перебор по строкам, получая результат поиска. Для большей информативности, я показываю количество найденных совпадений в одном из label.

Пример Влада с сайта WebDelphi

Я его немного упростил для себя, убрал опции, и мне немного непонятно было что же такое группы. У меня после повторения примера получилось так

1

 

Сделав пример, я разобрался в том, что же такое группы. Нулевая группа это все выражение в целом, далее все то, что идет в скобках. То есть в примере выше это “gmail.com” и “.com”, что соответствует частям регулярного выражения ([\w-]+(.[\w-]+)+) и (.[\w-]+)+) соответственно.

Интересно также, что код ниже отрабатывает даже если совпадений нет. В принципе он так и должен делать, просто имхо это немного выходит из логики регулярных выражений.

Код, который я использовал

В принципе, в общих чертах я разобрался для себя, что такое регулярные выражения, поэтому здесь я пока остановлюсь, если данная тема понадобится в работе, всегда можно продолжить изучать нюансы и тонкости.

This entry was posted in Delphi, Без рубрики, Регулярные выражения. Bookmark the permalink.