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

Одной из особенностей великих старых редакторов программирования (с легендарными названиями Unix, такими как Vi и Emacs) была их способность использовать регулярные выражения (он же regex) в операциях поиска и замены. Одна из замечательных особенностей редактора Notepad++ заключается в том, что он соответствует сильным сторонам регулярных выражений этих старых ветеранов, не скрывая их в лесу загадочных команд.

Предположим, что ваш HTML-код включает width=120px. Вы хотите, чтобы он был обновлен до XHTML-совместимого атрибута width=’120px’. (В HTML кавычки нужны редко.вXHTML они обязательны.) Простой поиск/замена сделает свое дело, но у вас также есть width=60px и много других ширин. Вам нужно регулярное выражение.

Это самый распространенный случай регулярного выражения. Вам нужно найти некоторый текст, часть которого является фиксированной, а часть-переменной. Вам нужно изменить фиксированную часть, но сохранить переменную часть. Итак, вот крошечное резюме регулярных выражений (есть целые книги, написанные на эту тему!), чтобы вы начали.

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

  • a буква «a» соответствует самой себе—большинство символов соответствуют только самим себе
  • . точка соответствует любому символу вообще
  • \s (два символа, читаемые как «escapes») соответствует любому пробелу (пробел, табуляция, возврат или новая строка)
  • \d (любая цифра, от 0 до 9)
  • \w (w означает «слово») любой алфавит (верхний или нижний регистр), цифра (от 0 до 9) или подчеркивание

Знаки препинания иногда имеют особое значение. Независимо от того, являются ли они особенными или нет, если вам нужна сама метка, предшествуйте ей обратной косой чертой. (Если вы не уверены, что часто бывает, «убегайте» от знака препинания — заранее проверяйте его обратной косой чертой.)

  • \. точка
  • \+ знак плюс

Одиночные строчные буквы, идентифицирующие специальные классы символов, могут быть перевернуты по значению с помощью заглавной буквы:

  • \s любой пробельный символ
  • \S любой символ, не являющийся пробелом
  • \d любая десятичная цифра
  • \D любой символ, КРОМЕ десятичной цифры

Множители

Некоторые символы регулярных выражений обеспечивают коэффициент повторения, называемый «множителем». Наиболее распространенными являются:

  • + (один или несколько) \d+ — это «одна или несколько цифр», шаблон, который соответствует каждому положительному десятичному целому числу
  • *(ноль или больше).* — это «ноль или больше любого символа»
  • ? (ноль или единица) предыдущий символ является необязательным

Альтернативы и группировка

Оператор | означает «или». Скобки группируют вещи. (a|b) означает «a» или «b».

Классы

Заключение списка символов в скобки означает: «совпадите точно с одним из этих символов.» Пример: [iou]. Это сокращение для (i|o|u).

Паттерн d[iou]g соответствует «dig» или «dog» или «dug». Он не соответствует «drag» или «dragon».

Вы можете использовать дефисы для обозначения диапазонов символов. [A-Z] соответствует любой заглавной букве.

Каретка («^») в первой позиции класса символов отрицает класс. Это означает «соответствовать любому символу, КРОМЕ одного из них. d[^iou]gсоответствует любой строке d.g(«D», а затем любой символ, затем «G»), кроме как «копать», «собака» или «копал». [^A-Z] соответствует любому символу, КРОМЕ заглавной буквы.

Обратные ссылки

Если регулярное выражение содержит круглые скобки, символы, соответствующие этим скобкам, могут быть использованы позже. Это называется «обратным обращением». Символы внутри группы, начинающиеся с первого » ( » , называются либо «$1» (в Perl и языках, которые близко копируют Perl), либо «RegExp.$1» в JavaScript или «\1» в строке Замены в редакторе, таком как Notepad++.

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

Давайте вернемся к нашей проблеме: мы хотим найти все вхождения «width=», за которыми следует спецификация ширины. Мы хотим заменить его той же спецификацией, но значение ширины должно быть заключено в одинарные кавычки. Чтобы все было просто, предположим, что все ваши спецификации ширины находятся в одной строке и не включают встроенные кавычки.

Самая простая часть-это сопоставление «width=». Регулярное выражение для этого-простоwidth=. Если вы не уверены, имеет ли знак равенства специальное значение регулярного выражения (это не так), более безопасная версия-width\=.

Но что дальше? У вас будет несколько цифр и букв «px». Это будет \d+px (при условии, что вся ваша ширина будет в пикселях). Пришло время создать тестовый файл и опробовать его.

Тестовые Данные

Тест первый: смыть влево

<divwidth=100px>

Тест второй: не влево, другие атрибуты

HTML <tag other=thing1 width=200px that=thing2>

Тест третий: другой размер ширины

<divwidth=50%>

Крепления пикселей

Эта спецификация будет указывать ширину, разделенную пикселями:

Find what: width\=(\d+px)
Replace with: width=»\1

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

Фиксирование всей ширины

Что произойдет, если ширина будут выражены в пикселях, некоторые-в эм, процентах или точках (и да, есть и другие возможности). Мы могли бы попытаться составить исчерпывающий список: (px|pt|%|…). Но это трудный путь.

Спецификация ширины должна завершаться закрытием тега > или пробелом, предшествующим другому атрибуту. width\=([^\s>]+) должен работать. Это «width=», за которым следует один или несколько символов, КРОМЕ тех, которые указаны в классе. Класс задает любой символ пробела или символ «>».

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

Findwhat: width\=([^\s>]+)
Replace with: width=»\1

Тест первый: смыть влево

<divwidth=’100px’>

Тест второй: не слева, другие атрибуты

другие HTML здесь<tag other=thing1 width=’200px’ that=thing2>

Тест третий: другой размер ширины

<divwidth=’50%’>

Повторение

Наш шаблон поиска — ширина…. Это находит строку «width» (за которой следует «…», которая является частью этого объяснения, а не частью регулярного выражения — это означает, что мы доберемся туда дальше). Далее следовал ускользающий знак препинания: width\=…. Это просто означает «ширина», за которой следует «знак равенства без особого значения.»

Затем мы использовали круглые скобки для группировки подвыражения: width\=(…). Это делает подвыражение доступным в строке Замены как \1. (Если бы у нас было больше групп, вторая была бы \2 и так далее. Мы могли бы даже вложить их, если бы захотели. Если вы не уверены, что входит в какую группу, посчитайте открытые круглые скобки.)

Теперь давайте заглянем внутрь этого подвыражения: (…). Мы использовали класс символов, за которым следовал знак плюс: ([…]+). Класс символов соответствует одному символу, одному из символов в классе. Знак плюс-это множитель, который говорит: «Используйте один или несколько из предыдущих.»

Теперь мы погрузимся в этот класс символов, показанный выше как […]. Он начинается с каретки [ ^ … ], что означает «используйте любые символы, КРОМЕ тех, которые указаны в этом классе.» Он продолжается с экранированной «s», \s, которая является любым символом пробела, а затем с»>», который сам по себе является знаком «больше, чем». Таким образом, отрицаемый класс будет соответствовать любому символу, КРОМЕ пробела или «>».

Заключение

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

Теперь представьте себе этот поиск/замену на основе регулярных выражений, используемый в сочетании с функцией Поиска в файлах. Вы тестируете на фрагменте, затем на небольшом файле. Это работает. Вы делаете резервную копию своих файлов, затем нажимаете кнопку «Найти в файлах», ставите галочку «Во всех подпапках» и бинго!, вы преобразовали весь сайт.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *