Статьи

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

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

Итак, как вы можете практиковать использование регулярных выражений, если вы ограничены только использованием их в своем коде? Ответ заключается в том, чтобы использовать утилиту, которой много, которая использует регулярные выражения для выполнения поиска и замены. Я уверен, что все знакомы со стандартным типом поиска и замены «найди х и замени его на у ». Большинство IDE и текстовых редакторов имеют встроенные механизмы регулярных выражений для обработки поиска и замены. В этой статье я хотел бы пройти серию упражнений, которые помогут вам попрактиковаться в использовании регулярных выражений.

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

Слово Границы

Давайте для начала будем использовать следующий код; Я разработал его специально, чтобы проиллюстрировать определенные предостережения при поиске и замене по мере вашего прогресса.

<div id="navigation">
 <a href="divebomb.php" title="All About Divebombs">Divebombs</a>&nbsp;&nbsp;|&nbsp;&nbsp;
 <a href="endives.php" title="All About Endives">Endives</a>&nbsp;&nbsp;|&nbsp;&nbsp;
 <a href="indivisible.php" title="Indivisible by Zero">Indivisible Numbers</a>&nbsp;&nbsp;|&nbsp;&nbsp;
 <a href="division.php" title="All About Division">Divison</a>&nbsp;&nbsp;|&nbsp;&nbsp;
 <a href="skydiving.php" title="All About Skydiving">Skydiving</a>&nbsp;&nbsp;|&nbsp;&nbsp;
</div>

Этот навигационный код в идеале должен быть неупорядоченным списком, а не свободными якорями внутри тегов div Вы не можете просто заменить слово «div» на «ul», потому что divebomb станет ulebomb, endives станет enules и т. Д. Вы также не можете использовать «<div», потому что он пропустит закрывающий тег div Вы можете вручную заменить теги divulb

В поле поиска введите: bdivb
В поле Заменить введите: ul

Это только заменяет текст «div», который был ограничен границами слова. Границы слова позволяют выполнять поиск только по всему слову, поэтому слова «div» в <div id = «navigation»> и </ div> совпадают, а подстроки в якорях остаются одни.

Позже вы также увидите w

Группировки и обратные ссылки

Продолжая с измененным кодом из первого примера, давайте продолжим рефакторинг списка. Прямо сейчас ваш код должен выглядеть так:

 <ul id="navigation">
 <a href="divebomb.php" title="All About Divebombs">Divebombs</a>&nbsp;&nbsp;|&nbsp;&nbsp;
 <a href="endives.php" title="All About Endives">Endives</a>&nbsp;&nbsp;|&nbsp;&nbsp;
 <a href="indivisible.php" title="Indivisible by Zero">Indivisible Numbers</a>&nbsp;&nbsp;|&nbsp;&nbsp;
 <a href="division.php" title="All About Division">Divison</a>&nbsp;&nbsp;|&nbsp;&nbsp;
 <a href="skydiving.php" title="All About Skydiving">Skydiving</a>&nbsp;&nbsp;|&nbsp;&nbsp;
</ul>

Вы можете легко выполнить стандартный поиск и замену по тегам привязки без каких-либо проблем, которые мешали вам делать это с помощью div, но где в этом удовольствие? В духе практики давайте с помощью регулярных выражений обернем якоря в теги li

Чтобы выбрать якоря, введите в поле поиска следующее: (<a.*>)
В поле Заменить введите: <li>$1</li>

Не обращая внимания на круглые скобки в шаблоне поиска, давайте разберем шаблон и обсудим каждый его фрагмент. Первая часть — это <a, которая сообщает механизму регулярных выражений, что он соответствует символу «меньше», за которым следует буква a . Следующая часть этого фрагмента -. *>, Которая указывает движку на совпадение с любым символом ноль или более раз, за ​​которым следует символ больше чем. Эта часть соответствует тегам привязки в блоке кода выше.

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

Шаблон замены указывает движку заменить шаблон поиска открывающим тегом lili В этом примере есть только одна группа (потому что есть только один набор скобок), поэтому $1li (Некоторые редакторы могут использовать 1$1$1

Вы можете иметь несколько групп, и группы могут быть вложенными, что вы увидите в одно мгновение. Вы собираетесь изменить шаблоны, которые вы только что использовали для добавления тегов li Отмените только что сделанные замены. Обычно что-то вроде CtrlZ

В поле поиска введите: <li>(<a.*>)</li>
В поле Заменить введите: $1

Несколько группировок

Хорошо, теперь давайте обернем теги привязки в теги liclassid Для этого вы будете использовать следующее:

Поиск: (<a.*>(w+).*</a>)
Заменить: <li class="navEntry" id="$2">$1</li>

Как и в шаблоне поиска второго примера, <a. *> Соответствует тегам привязки. Вы просите механизм регулярных выражений найти строку, которая начинается с символа больше чем, за которым следует буква a , за которой следует серия из нуля или более символов, которая заканчивается символом меньше чем. С w+ Скобки вокруг w+ Затем вы добавили. * К шаблону, чтобы соответствовать любым другим символам, которые могут появиться перед закрытием тега привязки. В результате $1$2

Разбивая замену, вы начинаете с liclassid Вместо предоставления значения идентификатора у вас есть $2 Это говорит механизму регулярных выражений, что вы хотите использовать контент, сохраненный во второй группе из шаблона поиска, который в данном случае является w+ Затем вы открываете тег li$1li

Будьте осторожны, когда определяете, какие группы заменить. Рассмотрим следующий гипотетический пример (я использовал имена групп вместо шаблонов, чтобы проиллюстрировать, как работает группировка):

  (Группа1 (group2)) (group3) 

Использование вышеуказанного дает вам следующие результаты:

  $ 1 = group1group2
 $ 2 = группа2
 $ 3 = группа 3 

$1group1, и group2, потому что круглые скобки заключают оба из них. Это верно, хотя group2 является группой сама по себе. И тогда, конечно, group3 является группой для себя.

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

Поиск: &nbsp;&nbsp;|&nbsp;&nbsp;
Оставьте поле Replace пустым.

Ваш код теперь должен выглядеть следующим образом — хороший, аккуратный, хорошо структурированный список, с которым вы можете использовать CSS для стиля:

 <ul id="navigation">
 <li class="navEntry" id="Divebombs"><a href="divebomb.php" title="All About Divebombs">Divebombs</a></li>
 <li class="navEntry" id="Endives"><a href="endives.php" title="All About Endives">Endives</a></li>
 <li class="navEntry" id="Indivisible"><a href="indivisible.php" title="Indivisible by Zero">Indivisible Numbers</a></li>
 <li class="navEntry" id="Divison"><a href="division.php" title="All About Division">Divison</a></li>
 <li class="navEntry" id="Skydiving"><a href="skydiving.php" title="All About Skydiving">Skydiving</a></li>
</ul>

Резюме

Спасибо, что нашли время, чтобы узнать немного больше о регулярных выражениях и попрактиковаться с ними, используя поиск и замену. Я призываю всех, кто изо всех сил пытается понять концепции, на практике использовать поиск и замену в их редакторе, потому что это удобно и обычно обеспечивает немедленную визуальную обратную связь. При необходимости вы можете скопировать и вставить контент, с которым вы работаете, в пустой файл и поэкспериментировать с ним, запускать замены и отменять их, пока не получите то, что вам нравится.