Статьи

Регулярные выражения — Должен Любить Их

Этим утром я передал правила нашего регулярного сеанса «Разговор с экспертами» Фернандо, который отлично справился с управлением чатом, тема которого — «Регулярные выражения». Нашими экспертами сегодня были сотрудники форума SitePoint Том Паркин и Аллан Х, которые проделали потрясающую работу по объяснению концепции, которую большинство программистов считают довольно примитивной.

Вот список ресурсов, которые вышли из сессии:

Что такое регулярное выражение?
Как создать RegEx
Синтаксис и параметры

И если вам нравятся головоломки … вы можете или не можете любить эти …

Кроссворд RegEx
И еще один кроссворд
И еще один

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

И без лишних слов — стенограмма сессии:

[23:00] <nandotinoco> Добро пожаловать в тех людей, которые только что присоединились. Том Паркин (@ParkinT) — наш эксперт сегодня. Он является сотрудником форумов SitePoint и здесь, чтобы поговорить о регулярных выражениях

[23:01] <ParkinT> AllanH также является сотрудником форумов Sitepoint и сегодня будет экспертом.

[23:02] <ParkinT> Эта тема слишком БОЛЬШАЯ для одного человека.

[23:03] <johnlacey> Где бы вы порекомендовали законченного новичка, у которого нет опыта работы с регулярными выражениями? лол

[23:03] <AllanH> Существуют разные «ароматы» регулярных выражений. мы хотели бы обсудить Perl-совместимые регулярные выражения

[23:03] <ParkinT> Регулярные выражения универсальны среди большинства языков программирования. Однако реализация зависит от языка

[23:03] <ParkinT> Мы бы хотели, чтобы обсуждение было очень широким и общим.

[23:04] <ParkinT> Точно, Аллан.

[23:04] <AllanH> Переписать мод Apache, PHP, Javascript и, конечно, Perl используют PCRE.

[23:04] <ParkinT> Цель и задача RegEx — анализировать, сопоставлять, находить и заменять символы и строки.

[23:04] <adams> почему я должен изучать регулярные выражения в программировании?

[23:05] <ParkinT> Отличный вопрос.

[23:05] <ParkinT> На самом деле, вам НЕ ТРЕБУЕТСЯ изучать RegEX

[23:05] <ParkinT> Вы не обязаны изучать операторы IF или Switch.

[23:05] <Jerry> Насколько близко GAWK RE к PCRE?

[23:05] <ParkinT> Это просто еще один инструмент, который может (часто) помочь вам.

[23:05] <AllanH> Есть хорошие строковые функции, но иногда они недостаточно мощные

[23:05] <johnlacey> Это действительно о распознавании образов, не так ли? Я видел регулярные выражения для проверки того, что адреса электронной почты соответствуют ожидаемому формату, а также в перенаправлениях .htaccess…

[23:06] <ParkinT> Это верно.

[23:06] <AllanH> И не всегда так просто

[23:06] <AllanH> Я видел некоторых, которые получают то, что они хотят, и счастливы

[23:07] <ParkinT> Я не уверен, насколько близка реализация GAWK к PCRE.

[23:07] <AllanH> … пока они тоже не получат то, что они хотят НЕ получить

[23:07] <Джерри> Так верно, Аллан

[23:08] <johnlacey> Итак, не могли бы вы привести пример (простого) регулярного выражения?

[23:08] <ParkinT> Что можно сказать обо всем программном коде, а?

[23:08] <Jerry> В большинстве случаев легче понять проблему, когда вы получаете слишком много, чем когда вы ничего не получаете

[23:08] <ParkinT> Джон Лейси задал отличный вопрос …

[23:08] <AllanH> Достаточно верно, я думаю, что регулярное выражение — это отчасти наука, а отчасти искусство

[23:09] <ParkinT> Проверка электронной почты — это «классический» вариант использования RegEx, но я не думаю, что это очень хороший пример.

[23:09] <AllanH> Я начал с документации по PHP

[23:09] <johnlacey> Поскольку адрес электронной почты может соответствовать установленному формату, но все еще не существует?

[23:10] <AllanH> Прочитайте это и все еще часто обращайтесь к нему

[23:10] <ParkinT> Парсинг данных для определения, например, всех цифр ПОСЛЕ десятичной точки может быть примером «простого» регулярного выражения. Аллан, ты согласен?

[23:10] <AllanH> Да, и кое-что, что может появиться

[23:11] <ParkinT> Предположим, у меня есть эта строка:

[23:11] <ParkinT> 3.14159

[23:11] <ParkinT> Используя RegEx, вы ищите шаблоны, как упоминал Джонласи.

[23:11] <ParkinT> Аллан, поправь меня там, где я что-то неправильно формулирую …

[23:12] <ParkinT> Десятичная точка становится «якорем» в нашей оценке. Мы хотим посмотреть, что будет после этого.

[23:12] <AllanH> и не можешь или не хочешь разыграть это как поплавок?

[23:13] <ParkinT> DRAT. Я не могу ввести косую черту в этом чате.

[23:13] <adams> / \

[23:13] <Джерри> / foo /

[23:13] <ParkinT> Есть ли контрольные персонажи, о которых я не знаю ?? Я думаю, что я просто отключил всю власть в Нью-Йорке!

[23:13] <AllanH> Если бы вы знали, сколько чисел было всегда впереди, вы могли бы использовать строковые функции

[23:14] <ParkinT> «ЕСЛИ» ты знал. Правильно.

[23:14] <ParkinT> Предположим, вы не

[23:14] <Джерри> обратный слэш перед fwdslash

[23:14] <ParkinT> Спасибо. Это еще больше усложнит это !!!

[23:14] <AllanH> Но ради нас НУЖНО получить это десятичное число!

[23:15] <ParkinT> /d*[.](d*)/

[23:15] <ParkinT> НЕТ. Предыдущие косые черты появляются тоже.

[23:15] <ParkinT> Вот как я бы подошел к этому. Косая черта «d» представляет любую цифру (цифра)

[23:16] <ParkinT> Мы знаем, что есть НЕИЗВЕСТНОЕ число цифр ДО десятичной точки.

[23:16] <ParkinT> косая черта d, за которой следует звезда d *

[23:16] <AllanH> не является ли «.» «Подстановочным знаком»?

[23:16] <ParkinT> Далее идет десятичная дробь. Тем не менее, точка является символом команды в RegEx, поэтому мы должны определить его как EXPLICIT

[23:17] <ParkinT> Точно, АлланХ

[23:17] <ParkinT> Но если вы поместите символы в квадратные скобки, они будут оценены как литералы

[23:17] <ParkinT> Так [.] Будет представлять точку

[23:17] <AllanH> и только ОДНА точка

[23:18] <ParkinT> Далее идут данные, которые мы пытаемся получить. Поэтому мы должны заключить его в фигурные скобки () для представления группы.

[23:18] <ParkinT> и эти данные ТАКЖЕ будут набором цифр с неизвестной длиной (d *)

[23:19] <ParkinT> Но предположим, что мы даже не уверены, что есть какие-либо цифры перед десятичной дробью?

[23:19] <AllanH> «звезда» означает ноль или более

[23:19] <ParkinT> В этом случае это d * [.] (D *) не будет работать

[23:19] <ParkinT> Вы правы. Я путал звезду и знак вопроса;

[23:20] <ParkinT>, что означает ОДИН или более. Плохой пример. Я должен был использовать? а потом объяснил звезду. * смущенный.

[23:20] <ParkinT> Чтобы лучше ответить на первоначальный вопрос, вот некоторые «основы» регулярного выражения.

[23:21] <ParkinT> Как указала AllanH, звезда означает ноль или более и относится к набору, который ей предшествовал.

[23:21] <AllanH> Мне нравятся Документы Mozilla для ссылки на Javascript

[23:21] <ParkinT> У вас есть ссылка?

[23:22] <AllanH> https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions

[23:22] <ParkinT> Это здорово! Теперь мы можем идти домой !!

[23:22] <AllanH> https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp

[23:22] <AllanH> Может и нет, Документы не самая простая вещь, которую нужно переварить

[23:23] <AllanH> напр. http://www.pcre.org/pcre.txt

[23:23] <ParkinT> RegEx трудно для большинства людей, потому что это может быть очень пугающим.

[23:24] <johnlacey> Я знаю, что у меня только второй кофе за день, и мой мозг немного взрывается, просто читая документацию Mozilla. лол

[23:24] <ParkinT> Как и все, если подойти к нему осторожно — по одному кусочку за раз — и попрактиковаться в малых дозах …

[23:24] <ParkinT> Синтаксис странный, и выбор символов делает его очень запутанным для чтения.

[23:24] <AllanH> Я только учусь по принципу «нужно знать» и все еще учусь.

[23:25] <johnlacey> Различаются ли регулярные репрессии между языками или они довольно универсальны?

[23:25] <ParkinT> Существует множество инструментов (онлайн и для настольных компьютеров), которые оценят RegEx. Они позволяют вам «тыкать и пробовать» различные модели

[23:25] <ParkinT> Как я уже говорил, «Регулярные выражения универсальны среди большинства языков программирования. Тем не менее, реализация зависит от языка «

[23:26] <ParkinT> Существуют общие правила синтаксиса, которые не различаются между языками.

[23:26] <AllanH> Я думаю, что после того, как вы разберетесь с базовым синтаксисом, они во многом похожи, по крайней мере, настолько, чтобы вы могли понять, как делать то, что вам нужно, обращаясь к Документам.

[23:26] <ParkinT> Ruby, например, распознает RegEx практически в любом месте, где может использоваться строка.

[23:27] <AllanH> и если это не двоичный файл, это текст

[23:29] <AllanH> Я думаю, что многие из

[23:30] <AllanH> Я думаю, много «инструментов», например. сопоставлять, заменять, разделять — одинаковы для разных языков

[23:30] <nandotinoco> Многие веб-разработчики впервые сталкиваются с RegEx, когда исправляют ошибку в файле .htaccess или пытаются выяснить, какие перенаправления URL-адресов. Есть ли у вас какие-либо советы или хитрость для этих случаев?

[23:30] <ParkinT> Абсолютно !!

[23:31] <ParkinT> Мой первый ответ на этот вопрос, nandotinoco, это «StackOverflow» !!

[23:31] <ParkinT> насмешливый

[23:31] <AllanH> Вы можете попробовать задать вопрос на http://www.sitepoint.com/forums/forumdisplay.php?97-Server-Configuration-Apache-amp-URL- форуме переписывания

[23:32] <nandotinoco> Так лучше 😉

[23:32] <ParkinT> Эти переписки кажутся своими зверями.

[23:32] <johnlacey> Я видел примеры, когда они проверяют для domain.com/directory и меняют его на domain.com/directory/

[23:32] <AllanH> В Apache есть такие вещи, как «флаги», которые иногда могут быть хитрыми, но синтаксис похож

[23:33] <AllanH> Да, нужно любить «дружественные URL»

[23:33] <ParkinT> Это верно. Захватив группы и затем применив то, что было захвачено, вы можете полностью переставить вещи

[23:34] <AllanH> и возможность перенаправить HTTP-запрос со старой страницы на новую.

[23:35] <ParkinT> Если вы хотите отточить свои навыки в RegEx, в Интернете есть множество загадок и кроссвордов, в которых используются регулярные выражения.

[23:36] <johnlacey> Не могли бы вы понравиться нам одной из этих головоломок? Звучит как веселье (но и вызов).

[23:36] <johnlacey> свяжись с нами *

[23:37] <ParkinT> Поиск …

[23:37] <AllanH> Как вы думаете, какая разница в производительности между использованием [a-zA-Z]…. [az] / i и [w]?

[23:38] <AllanH> я чувствую, что лучше всего читать, когда начинаешь, а затем работать более элегантно по мере продвижения

[23:38] <ParkinT> На этот вопрос сложно ответить, возможно, он различается в зависимости от языка и, я уверен, будет очень незначительным.

[23:39] <ParkinT> Вот тот, который я признаю, что я не смог завершить: http://www.coinheist.com/rubik/a_regular_crossword/grid.pdf

[23:39] <johnlacey> Спасибо, ParkinT

[23:39] <ParkinT> Но, лучше для начала, я только что нашел это в поиске Google: http://regexcrossword.com/

[23:40] <AllanH> строка длиной 30 символов, но читаемая, в сравнении с тем же эффектом, что и длина 8 символов, но ее нужно мысленно «перевести».

[23:40] <ParkinT> И это выглядит интересно… http://www.regexcrosswords.com/

[23:40] <ParkinT> Я согласен, АлланХ.

[23:41] <ParkinT> Разработчики, как правило, предпочитают «элегантность» и «сообразительность».

[23:41] <ParkinT> Я совершенно виновен, как обвинение.

[23:41] <ParkinT> Сжатие — это хорошая вещь, к которой нужно стремиться. Но удобочитаемость важна, потому что обслуживание кода является критическим (и очень дорогим).

[23:41] <AllanH> и, как вы говорите, с точки зрения производительности, незначительная разница

[23:42] <AllanH> но мы ДЕЙСТВИТЕЛЬНО хотели бы похвастаться;)

[23:42] <ParkinT> Если другой разработчик (или даже вы в будущем) испытывает трудности с расшифровкой намерения выражения ..

[23:42] <ParkinT>, что переводится как время.

[23:42] <ParkinT> LOL АБСОЛЮТНО.

[23:42] <johnlacey> Я полностью согласен — читабельность так важна.

[23:43] <AllanH> LOL добавить комментарий, который длиннее, чем подробный код

[23:43] <ParkinT> Возможно, мы должны извлечь урок из этих головоломок в режиме онлайн (каламбур) и построить курс регулярных выражений на «Обучаемые».

[23:44] <grrowl> irt w по сравнению с [az], w на самом деле медленнее, потому что соответствует LOT больше, чем просто az, включая «слова» многих других языков

[23:44] <AllanH> @ParkinT один для MC?

[23:46] <AllanH> правда, «слово» в Perl не всегда является английским словом

[23:47] <AllanH> напр. my_function

[23:47] <ParkinT> В то же время, «что такое несколько миллисекунд среди друзей?»

[23:48] <grrowl> да, разница в производительности очень мала … если вы специально не оптимизируете этот случай, всегда выбирайте наиболее читаемый код

[23:49] <AllanH> Так что мне интересно, что я бы посчитал основными необходимыми вещами, чтобы «получить» в первую очередь. побег персонажа приходит на ум;)

[23:50] <AllanH> и ^ начало и конец $

[23:50] <ParkinT> По моему опыту, «основы» — это те вещи, которые вы используете чаще всего.

[23:50] <ParkinT> Да. Начало и конец. Количество ? * + {.}

[23:50] <ParkinT> И (как я это называю) ярлыки: w W s S

[23:51] <ParkinT> d

[23:51] <ParkinT> и НЕ ^

[23:51] <AllanH> Я постоянно использую квантификаторы

[23:51] <AllanH> и классы персонажей

[23:51] <ParkinT> Это важно, потому что реализации MOST RegEx очень жадные.

[23:52] <ParkinT> Без квантификаторов вы могли бы сравниться гораздо дальше, чем предполагалось.

[23:53] <AllanH> true, сколько раз я видел поток, в котором ОП хотел один тег, но получал первый тег до последнего

[23:53] <ParkinT> Чтобы прокомментировать предыдущий комментарий, я нашел, что это очень, очень поучительно: http://regexcrossword.com/challenges/tutorial/puzzles/1

[23:54] <ParkinT> Нажмите на ПОМОЩЬ в верхней области навигации.

[23:56] <ParkinT> История регулярных выражений очень интересна. Это началось до появления компьютеров в любой форме, какой мы их знаем сегодня.

[23:57] <ParkinT> Согласно Википедии ( http://en.wikipedia.org/wiki/Regular_expression) около 1950 года. Я бы рискнул предположить, что никого из нас здесь не было. И * я * довольно старый !!

[23:58] <ParkinT> Спасибо всем, что нашли время для участия.

[23:58] <ParkinT> Sitepoint и Learnables представляют собой невероятно богатый ресурс для современных веб-разработчиков.

[23:59] <nandotinoco> Да, если кто-то не хочет задать последний вопрос, мы должны завершить обсуждение здесь.

[23:59] <ParkinT> Если есть что-то, чем вы увлечены или чувствуете себя очень комфортно, сообщите нам.

[23:59] <ParkinT> «Эксперт» — это часто только тот, кто хочет говорить об этом вслух.

[23:59] <nandotinoco> Большое спасибо за то, что уделили время AllanH и ParkinT и поделились некоторыми своими знаниями.

[0:00] <AllanH> Я хотел бы добавить, что вопросы регулярных выражений можно задавать и на других форумах.

[0:00] <ParkinT> Форумы Sitepoint !!

[0:00] <AllanH> http://www.sitepoint.com/forums/forumdisplay.php?34-PHP

[0:00] <AllanH> http://www.sitepoint.com/forums/forumdisplay.php?15-JavaScript-amp-jQuery

[0:00] <AllanH> http://www.sitepoint.com/forums/forumdisplay.php?36-Perl-amp-Python

[0:01] <nandotinoco> Конечно. Форумы всегда там как отличный ресурс. Спасибо всем, кто присоединился к нам. На следующей неделе мы говорим о SASS

[0:01] <ParkinT> На следующей неделе мы получим SASSY

[0:02] <AllanH> Добро пожаловать, nandotinoco, спасибо всем