НЕ МОЛЧИ!!!    Сделай что-нибудь, чтобы остановить войну России в Украине.
...бойтесь людей равнодушных - именно с их молчаливого согласия происходят все самые ужасные преступления на свете.   ("Репортаж с петлёй на шее")

Примеры регулярных выражений

Примеры построения шаблона регулярных выражений.

В справочнике по регулярным выражениям был приведен материал по синтаксису регулярных выражений, теперь пришло время закрепить теорию практикой. Будем последовательно улучшать шаблон, пока не получим нужный результат поиска в тексте. Так, через практику, закрепление основ регулярных выражений будет намного эффективнее. Проделывать это мы будет с помощью онлайн сервиса regex101 следующим образом. Ниже приведена тестовая строка, которую надо будет скопировать в качестве «TEST STRING» на упомянутый сервис, затем вы будете копировать приводимые шаблоны поиска в окно «REGULAR EXPRESSING» и наблюдать результаты.

Поиск дат

Начнем с простого. Допустим нам надо найти в тексте все вхождения даты с начала и до середины нашего века. Для этого будем использовать такой шаблон.

Текст: Будем искать в этом тексте все вхождения даты с 2000 до 2050 года, включая 2009, но исключая 1299 и 12999 годы и числа внутри слова, например, число2021 число2021dd число 2021ss

Шаблон: 20[0-4][0-9]
Результат: Будем искать в этом тексте все вхождения даты с 2000 до 2050 года, включая 2009, но исключая 1299 и 12999 годы и число внутри слова, например, число2021 число2021dd число 2021ss.

Наш шаблон предписывает найти все вхождения определенных 4-х последовательных цифр, которые начинаются с «2». Как видите, были найдены все даты, включая явно не нужные. Улучшим наш шаблон. Чтобы исключить лишние вхождения, можно в конце шаблона добавить спецсимвол границы слова \b.

Шаблон: 20[0-4][0-9]\b
Результат: Будем искать в этом тексте все вхождения даты с 2000 до 2050 года, включая 2009, но исключая 1299 и 12999 годы и число внутри слова, например, число2021 число2021dd число 2021ss.

Как видите, результат стал лучше, но не идеальный. Ну что же, пойдем на кардинальные меры.

Шаблон: (?<=\s)20[0-4][0-9]\b
Результат: Будем искать в этом тексте все вхождения даты с 2000 до 2050 года, включая 2009, но исключая 1299 и 12999 годы и число внутри слова, например, число2021 число2021dd число 2021ss.

Вот теперь то, что надо. Мы добились желаемого результата, добавив в шаблон так называемое lookahead условие. Под терминоми lookahead, lookbehind подразумевается поиск определенной последовательности, перед(или после) которой затем ищется подстрока на соответствие основному шаблону. При этом подстрока удовлетворяющая первому шаблону в совпадениях не учитывается. Например, в нашем шаблоне была дана инструкция (?<=\s) найти подстроку, которая начинается на любой пробельный символ, эта подстрока во втором шаблоне(после закрывающей круглой скобки) не учитывается.

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

Теперь с помощью регулярных выражений будем выуживать информацию из HTML верстки. Технология та же, копируем тестовую строку и шаблон на онлайн сервис и фиксируем результат. Но в начале хотелось бы предварить их важным замечанием.

Примечание. Использование регулярных выражений для поиска или анализа верстки вопрос достаточно спорный. Здесь многое зависит от конкретных условий и целей. Хотелось бы привести по этому поводу, на мой взгляд, емкую и точную цитату. «… есть случаи, когда использование регулярного выражения для анализа некоторой информации из HTML является правильным способом — это во многом зависит от конкретной ситуации. … но в целом это плохая идея. Однако если структура HTML известна (и вряд ли изменится), то это все еще допустимый подход».  Другими словами, регулярные выражения не очень хорошо справляются с поиском в HTML и могут вас подвести, но в отдельных частных случаях использование регулярных выражений себя оправдывает.

А мы все-таки «покопаемся» в верстке. Вот новая тестовая строка.

<h2>Тестовая строка</h2>
<span>Рубаи</span>
<p>
<blockquote>
...
Не предавай друзей, их не заменишь,
И не теряй любимых — не вернешь,
Не лги себе — со временем проверишь,
Что этой ложью сам себя ты предаёшь.
</blockquote>
</p>
<p>А теперь немного верстки.</p>
<div>
<div><a href="http://webdesignstudio1.net/khayyam" rel="author"><span style="color:blue;">Омар Хайям - рубаи</span></a></div>
<p>Все свои замечания можете попробовать отправить на email captainNemo@nautilus.mail</p>

Поиск email

Попробуем найти в тексте email с помощью следующего шаблона.

Шаблон поиска email: [a-zA-Z_0-9]+@[a-zA-Z0-9]+\.[a-zA-z0-9]{2,63}
Результат: 
... 
<p>Все свои замечания можете попробовать отправить на email captainNemo@nautilus.mail</p>

При построении шаблона мы указали найти строку с символом «@», которому предшествуют один или более символов, перечисленных в первом классе шаблона, а после амперсанда должны присутствовать символы перечисленные в разделенных символом «.» классах. Другими словами мы попросили найти все совпадения с корректным написанием email в любом месте текста.

Того же результата можно добиться и более компактной записью шаблона.

Шаблон поиска email: [-.\w]+@([\w-]+\.)+[\w-]+

Поиск тегов

Теперь будем искать все теги со своими атрибутами.

Шаблон: <[^<>]+>
Результат: найдены все 19 тегов.

Чтобы найти доменное имя в верстке, можно воспользоваться таким шаблоном

Шаблон поиска доменного имени: [-.\w]+@([\w-]+\.)+[\w-]+

На этом, пожалуй все. Не будем увлекаться в деле(использование регулярных выражений для HTML), которое не слишком приветствуется.

Успехов в поисках! 🙂