LINUX.ORG.RU

Секреты регулярных выражений (regular expressions): Часть 1. Диалекты и возможности. Составление регулярных выражений

 ,


0

0

Словосочетание «регулярные выражения» слышал (или видел) каждый, чья деятельность так или иначе связана с использованием компьютеров. Многие применяют простейшие варианты регулярных выражений чуть ли не ежедневно, даже не подозревая об этом. Обычно им уделяется не слишком много внимания и, как правило, в контексте конкретной утилиты (grep, sed, less) или языка программирования (Perl, Python и т.д). В данном цикле статей я попытаюсь обобщить информацию о регулярных выражениях, сосредоточившись при этом не на элементарных «обучающих» примерах, которые всем известны, а на более тонких аспектах практического использования.

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

>>> Подробности

★★★

Проверено: annoynimous ()

/me ушел читать, давно хотелось почитать про regexp хорошую статью

kam ★★ ()

Годная статья. Чувствую, в третьей части уже будут какие-нибудь рекурсивные регэкспы для определения парности скобок.

mix_mix ★★★★★ ()

Ух ты хотябы одна годная статья.

anonymous ()

Меня больше интересуют лег регулнярых выражений. Как-то оптимизация поиска по адресной части regex среди большого набора regex с последующим опциональным выполнением операций/ управлением альтернативами.

alx_me ★★☆ ()

s/интересуют лег регулнярых/интересует лес регулярных/ же

alx_me ★★☆ ()

Не совсем практичные примеры. Зачем приводить пример с HTML тэгами тмпа '<[^>]+>'. У читателя может возникнуть впечатление, будто так можно парсить разметку. Остальные примеры не менее сферические. Практически все рассмотренные задачи намного проще и понятнее решать на perl/python с помощью обычных строковых функций split и т.п.

anonymous ()
Ответ на: комментарий от anonymous

Да не понятность то плевать, главное split быстрее.

alx_me ★★☆ ()
Ответ на: комментарий от svs

>Лучше купить это

В Феврале купил себе эту книжку. После чтива регекспы становятся действительно понятными. И даже больше, становится понятно как они работают внутри.

Mrxrrr ()
Ответ на: комментарий от anonymous

>Не совсем практичные примеры.

А в некоторых местах и кривые... (например 3.4 мало того, что он года не все покажет, но и условие на даты - это ппц. 30 и 31 день календаря на мусорку))))

anonymous ()

Экранирований что-то многовато. Ощущение, будто regexp только в grep и используются

dotbg ★★★★ ()

пожалуй одна из немногих адекватных статей от данного автора, примеры подкачали, но в целом неплохо

real_maverick ★★★ ()

не нашёл в статье ничего интересного. И в частности точка упомянута как любой символ, хотя точка не может включать \n. Лучше б написали пример как использовать sed или подобное для полнотекстового поиска, а не построчно, сам так и не смог этого добиться.

PGArchangel ()
Ответ на: комментарий от mix_mix

>Чувствую, в третьей части уже будут какие-нибудь рекурсивные регэкспы для определения парности скобок.

это невозможно читай матчасть

dimon555 ★★★★★ ()
Ответ на: комментарий от PGArchangel

точка включает _любой_ символ, который кушает регексп. другое дло, что параметром регекспа может быть включённая или отключённая многострочность.

boo32 ()
Ответ на: комментарий от boo32

>точка включает _любой_ символ, который кушает регексп. другое дло, что параметром регекспа может быть включённая или отключённая многострочность.

Если честно не понял. /a\nb/ поймает «a\nb», а /a.b/ не поймает. Хочешь сказать, что можно настроить так, что /a.b/ тоже начнет ловить? Если так, то покажи пример, если не трудно.

Vovka-Korovka ★★★★★ ()
Ответ на: комментарий от Vovka-Korovka

>точка включает _любой_ символ, который кушает регексп. другое дло, что параметром регекспа может быть включённая или отключённая многострочность.

дадада, хочу примера. Ибо включить многострочность можно с помощью модификатора в prce, в пхп (ну и значит пёрл тож), а про посикс я вообще не в курсе, как там это сделать. :)

PGArchangel ()
Ответ на: комментарий от dimon555

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

Legioner ★★★★★ ()
Ответ на: комментарий от PGArchangel

дадада, хочу примера.

Разобрался сам. Пример с многострочностью будет работать не везде. В perl следующий регексп сработал

if («a\nb» =~ /a.b/s)

Но в питоне многострочность не прокатила

re.search('a.b', 'a\nb', re.MULTILINE)

Vovka-Korovka ★★★★★ ()

Браво, очень полезно.

После скупонатруханных пресных манов, а также их кривых переводов статьи от IBM - божья роса.

mclaudt ()
Ответ на: комментарий от Vovka-Korovka

дело в том, что s - это не мультилайн, а сингл.

boo32 ()
Ответ на: комментарий от boo32

>дело в том, что s - это не мультилайн, а сингл.

Упс. Нашел. В питоне multiline/singleline на . никак не влияет. Зато есть re.DOTALL

Vovka-Korovka ★★★★★ ()

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

boo32 ()
Ответ на: комментарий от Vovka-Korovka

И всё же про многострочность - кроме использования php-cli (или пёрла/питона) есть ещё возможные варианты со стандартными командами баша? )

PGArchangel ()

Найдены секреты регулярных выражений (regular expressions)!!! Часть 1. Диалекты и невиданные ранее возможности. Секрет составления настоящих регулярных выражений

Fixed.

Вот так должен звучать текст _новости_

А сабж просто для толксов.

elf ()
Ответ на: комментарий от boo32

Что тут строить из себя принцесс. Так и есть, магия это. И не для программистов (программист в большинстве придумает как обойтись без re), а для админчегов и быдлокодеров, что ещё больше увеличивает магическую составляющую

anonymous ()
Ответ на: комментарий от anonymous

у меня пока скора мало, чтобы остроумно тебе ответить.

boo32 ()

Re: Секреты регулярных выражений (regular expressions): Часть 1. Диалекты и возможности. Составление регулярных выражений

3.3. Шаблон для поиска любого HTML-тэга выглядит на удивление просто:

<[^>]+>

...будет найден и односимвольный тэг <p>

Это при greedy-matching? А мужики-то не знают.

К примеру, если это выражения засунуть в привокси-фильтр

s@<[^>]+>@@sig
то он срежен весь HTML-документ, опознав его как один большой «тег».

shahid ★★★★★ ()

Не читал. Регекспы знаю, но не идеально, конструкции типа (?что-тотам) всё ещё ломают мне мозг. Стоит читать?

Xenius ★★★★★ ()

О чём думал автор статьи? Молодёжь понасмотрится примеров типа 3.4 и будет потом так и писать. Ужас.

WARNING ★★★★ ()

а нужны ли регекспы вобще?

alt0v14 ★★★ ()

меня раздражает то, что везде разные диалекты решулярных выражений Не понимаю, почему в мой любимый фреймворк Qt встроили какую-то кастрированную реализацию.

anonymous ()
Ответ на: комментарий от alt0v14

Нужны, как быстрое решение. Не будешь же ради поиска файлов на один раз писать отдельный скрипт.

anonymous ()

>Это при greedy-matching?

то он срежен весь HTML-документ, опознав его как один большой «тег».


А проверить? greedy, не greedy, результат будет правильный

goingUp ★★★★★ ()

Не нужно, так как проще ( И ПОЛЕЗНЕЕ ) купить книжку Фридла.

DELIRIUM ☆☆☆☆☆ ()

ушел читать... хорошая статья

Genuine ★★★ ()
Ответ на: комментарий от Mrxrrr

>В Феврале купил себе эту книжку.

за книгу тоже плюсую, купил где-то полгода назад, полезная и понятная.

programmist ()
Ответ на: комментарий от anonymous

Это не «тег». Там должно быть &gt вместо >, это тебе любой валидатор скажет.

farafonoff ★★ ()

статья — говно, конечно. комментаторы в большей части — неосиляторы. пичаль

bobrik ()
Ответ на: комментарий от Vovka-Korovka

это ненужно 8) парность скобок не должна определятсья с помощью режекспов

wfrr ★★☆ ()
Ответ на: комментарий от wfrr

этим людям волю дай, они числа будут через jQuery складывать

bobrik ()
Ответ на: комментарий от Legioner

>расширенные регулярные выражения, реализованные с помощью бектрекинга, которые позволяют больше.

соответствуют ли они машине Тьюринга по вычислительной мощности? какой вид грамматики способны распознать?

dimon555 ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.