Примеры построения шаблона регулярных выражений.
В справочнике по регулярным выражениям был приведен материал по синтаксису регулярных выражений, теперь пришло время закрепить теорию практикой. Будем последовательно улучшать шаблон, пока не получим нужный результат поиска в тексте. Так, через практику, закрепление основ регулярных выражений будет намного эффективнее. Проделывать это мы будет с помощью онлайн сервиса 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), которое не слишком приветствуется.
Успехов в поисках! 🙂