Статьи

Так ты хочешь выучить регулярные выражения?

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

Эта серия для вас, если вы разработчик, который читает сообщения Бена Наделя, содержащие регулярные выражения , и не знает, о чем он говорит. Серьезно, Бен, это непостижимо для нас, простых смертных:


<cfset blogContent = reReplace (blogContent, «</? \ w + (\ s * [\ w:] + \ s * = \ s * (» «[^» «] *» «| ‘[^’] * ‘ )) * \ s * /?> «,» «,» all «) />

(Похоже, сумасшедшая кошачья кошечка пошла на прану на клавиатуре, не так ли?)

Хватит хохота и тому подобное. На с обучением.

Примечание редактора:

Просто чтение этих постов в блоге не поможет вам. Откройте затмение и скопируйте / вставьте этот материал в диалог поиска / замены. Вы узнаете больше, или ваши деньги вернутся!

Итак, во-первых, нам нужен вариант использования. Давайте представим, что мы проходим старый код и собираемся добавить HTMLEditFormat вокруг некоторых аргументов, чтобы формы не ломались при наличии кавычек.

Предположим, этот набор объявлений:

<input name="fred" value="willy" />
<input name="bill" value="mickey" />
<input name="erin" value="harry" />
<input name="baz" value="pissette" />

Мы хотим превратить: <input name = «fred» value = «willy» /> в: <input name = «fred» id = «fred» value = «willy» />

Как правило, это была бы утомительная цепочка предплечья / запястья на клавиатуре, яростно резавшая / вставляющая и, как правило, хлопающая. Не так с регулярными выражениями. Regex — это сопоставитель шаблонов, и он может делать вещи Мы можем видеть, что наш код повторяется, и шаблон, который нам нужен: создать новый атрибут с именем ‘id’ и заполнить его значением из атрибута ‘name’ … что мы и будем делать снова и снова с помощью cut / паста / и т.д..

Мы можем определить этот шаблон в gobbledegook, определяя регулярное выражение, конечно, иначе я бы написал этот пост о Cute LOLCats, а не Cute Regexes. Не так ли? Мы пройдем упражнение, а затем посмотрим, почему оно сработало.

В Eclipse выполните следующее:

  1. Откройте новый файл и вставьте вышеуказанный набор объявлений: (запомните фрагмент выше, начиная с <input name = «fred» value = «willy» /> …)
  2. Откройте диалог поиска (я использую CTRL + F) и убедитесь, что включена опция Регулярное выражение
  3. Введите следующее в поле « Найти»: « Имя входа =« ([^ »] +)»
  4. Введите следующее в Replace: Input name = «$ 1» id = «$ 1»
  5. Нажмите Find и убедитесь, что шаблон соответствует тому, что мы хотим
  6. Наконец, нажмите Заменить все

Вы должны иметь это:

<input name="fred" id="fred" value="willy" />
<input name="bill" id="bill" value="mickey" />
<input name="erin" id="erin" value="harry" />
<input name="baz" id="baz" value="pisser" />

(если нет, вы пропустили шаг. Посмотрите на изображение и сравните с тем, что есть в диалоговом окне «Найти / заменить». Убедитесь, что в выражении поиска нет лишних пробелов)

Blamo! Ваш код теперь правильно отсортирован с новым атрибутом ID, и у вас даже не было синдрома запястного канала! Давайте расшифруем код, не так ли?

Вот часть поиска регулярного выражения: name = «([^»]) + «

  • name = «   Первый символьный блок — это слово ‘name’, за которым следует знак равенства, а затем двойная кавычка. Все эти литералы не нуждаются в экранировании.
  • (   Следующий символ — открытая скобка. Он определяет начало группы. Помните, что мы хотим использовать значение атрибута name, чтобы заполнить имя атрибута ID.
  • [^ «] +   Следующий блок определяет любой символ, который не является двойной кавычкой. Обратите внимание, что он начинается с открытой скобки, используемой для определения набора. Внутри открытой скобки указан карат. Это означает, что это противоположный день, и наш набор должен НЕ ВКЛЮЧАЕТ все, что следует. Далее следует двойная кавычка, потому что значение атрибута находится внутри границ двойных кавычек. Мы закрываем этот набор символов с помощью закрывающей скобки, затем символ плюс, потому что символ плюс определяет 1 или более предыдущего символа в выражении. Мы определенно хотим иметь более одного символа перед закрывающей двойной кавычкой, иначе мы не хотим совпадения.
  • ) И,   наконец, мы имеем закрывающую скобку , образующая конца нашей группы и еще двойные кавычки , символизирующие конец нашего согласования границы.

Все это определяет границы для символа, проходящего регулярное выражение gnome, чтобы взять материал внутри атрибута и удержать его.

Затем в разделе «Заменить» мы использовали: name = «$ 1» id = «$ 1»

  • Атрибуты ‘name’ и ‘id’ вместе с обоими знаками равенства и обоими наборами двойных кавычек являются буквальными, экранирование не требуется.
  • $ 1 относится к группе, которую мы определили во входных данных Find, и мы используем ее дважды. $ n называется обратной ссылкой.

Таким образом, на простом английском языке мы попросили регулярное выражение find / replace gnome: взять содержимое внутри атрибута ‘name’ и вставить его обратно в атрибут ‘name’, а также в новый атрибут ‘id’.

Я уверен, что вы можете согласиться, что это было намного проще, чем феерия копирования / вставки ..

Часть вторая

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

Предположим, этот набор объявлений:

product.setColor(arguments.color);
product.setSize(arguments.size);
product.setCondition(arguments.condition);
product.setRating(arguments.rating);
product.setReliability(arguments.reliability);
product.setNeedsBatteries(arguments.needsBatteries);

То, что мы хотим, это превратить: product.setColor (arguments.color); into: product.setColor (htmlEditFormat (arguments.color));

Как правило, это была бы утомительная цепочка предплечья / запястья на клавиатуре, яростно резавшая / вставляющая и, как правило, хлопающая. Не так с регулярными выражениями. Regex — это сопоставитель шаблонов, и он может делать вещи Мы можем видеть, что наш код повторяется, и шаблон, который нам нужен: взять все внутри скобок и обернуть его в функцию htmlEditFormat (). (То же самое мы бы делали снова и снова через вырезать / вставить / и т.д., не так ли?)

Мы можем определить этот шаблон в gobbledegook, определяющем регулярное выражение. Когда читаешь один кусок за раз, это действительно имеет смысл. Мы пройдем упражнение, а затем посмотрим, почему оно сработало.

В Eclipse выполните следующее:

Примечание редактора:

Просто чтение этих постов в блоге не поможет вам. Откройте затмение и скопируйте / вставьте этот материал в диалог поиска / замены. Вы узнаете больше, или ваши деньги вернутся!

  1. Откройте новый файл и вставьте вышеуказанный набор объявлений: (запомните фрагмент выше, начиная с product.setColor (arguments.color); …)
  2. Откройте диалог поиска (я использую CTRL + F) и убедитесь, что включена опция Регулярное выражение
  3. Введите следующее в поле « Найти»: «Ввод (\ ([^ \)] + \)»
  4. Введите следующее в Replace: Input (htmlEditFormat $ 1)
  5. Нажмите Find и убедитесь, что шаблон соответствует тому, что мы хотим
  6. Наконец, нажмите Заменить все

Вы должны иметь это:

product.setColor( htmlEditFormat( htmlEditFormat(arguments.color) ) );
product.setSize( htmlEditFormat(arguments.size) );
product.setCondition( htmlEditFormat(arguments.condition) );
product.setRating( htmlEditFormat(arguments.rating) );
product.setReliability( htmlEditFormat(arguments.reliability) );
product.setNeedsBatteries( htmlEditFormat(arguments.needsBatteries) );

(если нет, вы пропустили шаг. Посмотрите на изображение и сравните с тем, что есть в диалоговом окне «Найти / заменить». Убедитесь, что в выражении поиска нет лишних пробелов)

Blamo! Ваш код теперь все правильно HTMLEditFormatted, и у вас даже не было синдрома запястного канала! Давайте расшифруем код, не так ли?

Вот часть поиска регулярного выражения: (\ ([^ \)] + \))

  • (   Первый символьный блок представляет собой открытую скобку. Это в основном определяет группу. Вы можете видеть, что все выражение заключено в круглые скобки, поэтому мы будем рассматривать то, что найдено как группа.
  • \ (   Следующий фрагмент — это обратная косая черта. Чаще всего это экранирующий символ, что означает, что следующий символ рассматривается как литеральный символ, который мы хотим найти в нашей строке. Взяв следующий символ, мы видим, что хотим найти открытый символ. скобка.
  • [^ \)]   Следующий блок определяет любой символ, который не является закрывающей скобкой. Обратите внимание, что он начинается с открытой скобки, используемой для определения набора. Внутри открытого кронштейна находится карат. Это означает, что это противоположный день, и наш набор НЕ должен включать в себя все, что следует. Далее следует обратный слеш и закрывающая скобка, регулярное выражение для литерала ( затем закрывающая скобка.
  • + \)   Следующий фрагмент — это символ плюс, за которым следует обратный слеш и закрывающая скобка. Символ «плюс» определяет 1 или более следующего символа в выражении, который на самом деле является следующим следующим символом, поскольку нам необходимо использовать обратную косую черту, чтобы избежать закрывающей скобки.
  • )   Последний кусок, закрывающая скобка, определяющая конец нашей группы.

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

Затем в разделе Replace мы использовали: (htmlEditFormat $ 1)

  • Окружающие скобки являются буквальными, как и htmlEditFormat.
  • $ 1 относится к группе, которую мы определили во входных данных Find. (помните термин обратная ссылка?)

 

Таким образом, на простом английском языке мы попросили регулярное выражение найти / заменить gnome: взять содержимое в скобках и обернуть его (HTMLEditFormat + GROUPTEXT +).

С http://www.nodans.com