Если вы только начинаете с регулярных выражений (регулярных выражений), синтаксис на первый взгляд может показаться немного странным (я бы рекомендовал статью Джейсона Пасниковского в качестве хорошей отправной точки). Одна из вещей, которая мешает постигать регулярные выражения в начале, это небольшое количество раз, когда у вас есть возможность использовать их в своем коде, что, в свою очередь, ограничивает количество практики, которую вы используете. Профессионалы в любом качестве, будь то спорт, развлечения или развитие, всегда практикуют — одни практикуют больше, чем другие.
Итак, как вы можете практиковать использование регулярных выражений, если вы ограничены только использованием их в своем коде? Ответ заключается в том, чтобы использовать утилиту, которой много, которая использует регулярные выражения для выполнения поиска и замены. Я уверен, что все знакомы со стандартным типом поиска и замены «найди х и замени его на у ». Большинство IDE и текстовых редакторов имеют встроенные механизмы регулярных выражений для обработки поиска и замены. В этой статье я хотел бы пройти серию упражнений, которые помогут вам попрактиковаться в использовании регулярных выражений.
Я буду использовать NetBeans для этой статьи. В некоторых редакторах поведение регулярных выражений может немного отличаться от того, что вы видите здесь, поэтому, если вы используете что-то отличное от NetBeans и оно работает не совсем так, как вы ожидаете, обязательно прочитайте документацию для вашего конкретного редактора.
Слово Границы
Давайте для начала будем использовать следующий код; Я разработал его специально, чтобы проиллюстрировать определенные предостережения при поиске и замене по мере вашего прогресса.
<div id="navigation">
<a href="divebomb.php" title="All About Divebombs">Divebombs</a> |
<a href="endives.php" title="All About Endives">Endives</a> |
<a href="indivisible.php" title="Indivisible by Zero">Indivisible Numbers</a> |
<a href="division.php" title="All About Division">Divison</a> |
<a href="skydiving.php" title="All About Skydiving">Skydiving</a> |
</div>
Этот навигационный код в идеале должен быть неупорядоченным списком, а не свободными якорями внутри тегов div
Вы не можете просто заменить слово «div» на «ul», потому что divebomb станет ulebomb, endives станет enules и т. Д. Вы также не можете использовать «<div», потому что он пропустит закрывающий тег div
Вы можете вручную заменить теги div
ul
b
В поле поиска введите: bdivb
В поле Заменить введите: ul
Это только заменяет текст «div», который был ограничен границами слова. Границы слова позволяют выполнять поиск только по всему слову, поэтому слова «div» в <div id = «navigation»> и </ div> совпадают, а подстроки в якорях остаются одни.
Позже вы также увидите w
Группировки и обратные ссылки
Продолжая с измененным кодом из первого примера, давайте продолжим рефакторинг списка. Прямо сейчас ваш код должен выглядеть так:
<ul id="navigation">
<a href="divebomb.php" title="All About Divebombs">Divebombs</a> |
<a href="endives.php" title="All About Endives">Endives</a> |
<a href="indivisible.php" title="Indivisible by Zero">Indivisible Numbers</a> |
<a href="division.php" title="All About Division">Divison</a> |
<a href="skydiving.php" title="All About Skydiving">Skydiving</a> |
</ul>
Вы можете легко выполнить стандартный поиск и замену по тегам привязки без каких-либо проблем, которые мешали вам делать это с помощью div, но где в этом удовольствие? В духе практики давайте с помощью регулярных выражений обернем якоря в теги li
Чтобы выбрать якоря, введите в поле поиска следующее: (<a.*>)
В поле Заменить введите: <li>$1</li>
Не обращая внимания на круглые скобки в шаблоне поиска, давайте разберем шаблон и обсудим каждый его фрагмент. Первая часть — это <a, которая сообщает механизму регулярных выражений, что он соответствует символу «меньше», за которым следует буква a . Следующая часть этого фрагмента -. *>, Которая указывает движку на совпадение с любым символом ноль или более раз, за которым следует символ больше чем. Эта часть соответствует тегам привязки в блоке кода выше.
Скобки в шаблоне поиска выполняют специальную функцию; они группируют отдельные матчи, к которым вы можете обратиться позже. Добавляя круглые скобки, вы указываете механизму регулярных выражений сохранять результаты сопоставления, потому что они понадобятся вам позже. Вы можете получить доступ к этим группам по номеру.
Шаблон замены указывает движку заменить шаблон поиска открывающим тегом li
li
В этом примере есть только одна группа (потому что есть только один набор скобок), поэтому $1
li
(Некоторые редакторы могут использовать 1
$1
$1
Вы можете иметь несколько групп, и группы могут быть вложенными, что вы увидите в одно мгновение. Вы собираетесь изменить шаблоны, которые вы только что использовали для добавления тегов li
Отмените только что сделанные замены. Обычно что-то вроде Ctrl
Z
В поле поиска введите: <li>(<a.*>)</li>
В поле Заменить введите: $1
Несколько группировок
Хорошо, теперь давайте обернем теги привязки в теги li
class
id
Для этого вы будете использовать следующее:
Поиск: (<a.*>(w+).*</a>)
Заменить: <li class="navEntry" id="$2">$1</li>
Как и в шаблоне поиска второго примера, <a. *> Соответствует тегам привязки. Вы просите механизм регулярных выражений найти строку, которая начинается с символа больше чем, за которым следует буква a , за которой следует серия из нуля или более символов, которая заканчивается символом меньше чем. С w+
Скобки вокруг w+
Затем вы добавили. * К шаблону, чтобы соответствовать любым другим символам, которые могут появиться перед закрытием тега привязки. В результате $1
$2
Разбивая замену, вы начинаете с li
class
id
Вместо предоставления значения идентификатора у вас есть $2
Это говорит механизму регулярных выражений, что вы хотите использовать контент, сохраненный во второй группе из шаблона поиска, который в данном случае является w+
Затем вы открываете тег li
$1
li
Будьте осторожны, когда определяете, какие группы заменить. Рассмотрим следующий гипотетический пример (я использовал имена групп вместо шаблонов, чтобы проиллюстрировать, как работает группировка):
(Группа1 (group2)) (group3)
Использование вышеуказанного дает вам следующие результаты:
$ 1 = group1group2 $ 2 = группа2 $ 3 = группа 3
$1
group1, и group2, потому что круглые скобки заключают оба из них. Это верно, хотя group2 является группой сама по себе. И тогда, конечно, group3 является группой для себя.
Чтобы завершить очистку, вы можете удалить неразрывные пробелы и символ канала из конца строк и заменить их пустой строкой (перед выражением перед символом обратной косой черты должен стоять обратный слеш, поскольку он имеет особое значение). к двигателю).
Поиск: |
Оставьте поле 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>
Резюме
Спасибо, что нашли время, чтобы узнать немного больше о регулярных выражениях и попрактиковаться с ними, используя поиск и замену. Я призываю всех, кто изо всех сил пытается понять концепции, на практике использовать поиск и замену в их редакторе, потому что это удобно и обычно обеспечивает немедленную визуальную обратную связь. При необходимости вы можете скопировать и вставить контент, с которым вы работаете, в пустой файл и поэкспериментировать с ним, запускать замены и отменять их, пока не получите то, что вам нравится.