Как стать автором
Обновить

Комментарии 74

А я пользуюсь RegExr
А дебажить?
Я пишу на асме, дебажу в уме :)
Аналогично — использую RegExr для примерки.
Возможность вставить длинный текст — очень помогает в работе.
Есть еще замечательный www.debuggex.com
НЛО прилетело и опубликовало эту надпись здесь
Плюсую. Regexpal удобнее.
Всего 2 поля — ввод регулярного выражения, и поле для ввода анализируемого текста. Ну, несколько чекбоксов, которые понятно для чего нужны.
А что мы видим здесь?

Когда Я захотел прогнать регулярку с телефонами из regexponline.com, сначала тупил, как скопировать текст анализируемой строки. Сначала решил войти в режим редактирования строки даблкликом(Зачем он здесь? Почему нельзя сделать сингл клик?). Окей, вошел, выделяю строку, жму — Ctrl+C, иду в regexpal, ставлю курсор мыши в поле ввода анализируемого текста, жму Ctrl+V, в результате получаю:

— See more at: regexponline.com/#sthash.SMHP6oM0.dpuf

Что за х..? Я ж не это копировал!
Ладно, думаю, нужно повторить еще раз! На этот раз опять вхожу в режим редактирования строки, выделяю текст, жму ПКМ, выбираю пункт «Копировать», опять иду на Regexpal, ПКМ -> Вставить. И что же Я вижу?
Опять этот — See more at: regexponline.com/#sthash.SMHP6oM0.dpuf
Чтоза е… аррот!?

Окей! Тут меня посетила мылсь попробовать скопировать анализируемый текст не входя в режим редактирования текста, вуа-ля:

Call 1-800-333-4636 for any Question about Government — See more at: regexponline.com/#sthash.SMHP6oM0.dpuf

Эй! Откуда взялась эта лабуда с «See more ...»? Там не было этого текста!

Кнопки «Realtime editing» быть не должно, оно по умолчанию должно быть в реалтайм режиме. Почему никак не показываете инфу, что выполняется запрос к серверу во время редактирования регулярки в реалтайме? Я сначала изменил предоставленную по умолчанию регулярку, но кроме как в этом поле ввода ничего нигде больше не изменилось. Я подумал, что Я сделал что-то не так, ан-нет, просто ответ от сервера долго шел ко мне. Гифку какую-нибудь хоть покажите, ну или просто надпись с текстом типа такого: «Выполняется анализ, подождите.»

Кнопка «Expand regex» доставила. Весьма удобная штука, когда внезапно запутаешься в собственной регулярке.

И еще. Я, конечно, понимаю, что твиттер бутстрап это очень модно и круто, но меня бесит, что на своем ноуте с разрешением экрана 1366x768 при анализе одной только строки «Call 1-800-333-4636 for any Question about Government» у меня появляется вертикальный скролл.

Личный вывод: Симпатичненько, гламурненько, но не юзабельно. Интерфейс слишком избыточен. По компактнее бы все это…
Вот это да. Спасибо за отзыв! Косяк на счёт «See more» правда был — оказалось, скрипт социальных кнопок «ShareThis» автоматически добавлял ко всему копируемому и вставляемому тексту такую фразу, даже не спросив у меня разрешения. Остальные ваши замечания я добавил в todo-лист, обязательно сделаю, спасибо.
использую только rubular.com
Не плохо. Но функционала бы побольше. Та же библиотека. Подсветка групп. И т.д.
Странно, а почему 100, а не 198?
Видимо остальные проблемы были такие же большие.
НЛО прилетело и опубликовало эту надпись здесь
Может быть и не надо.(с)
НЛО прилетело и опубликовало эту надпись здесь
По вашему совету решил посмотреть что это за курс, тем более тема давно интересовала. С удивлением отметил что на сайте стенфорда есть адекватный перевод лекций на русский язык. Очень неожиданно
НЛО прилетело и опубликовало эту надпись здесь
Cпасибо, как правило так и делаю, но меня поразил факт наличия русских субтитров, причем переведенных не машиной, на курсере. Именно эта совокупность
Замечательный инструмент! Всегда боялся регэкспов, и зачастую городил вместо них сложные конструкции, в которых потом тратил время на то чтобы разобраться.
>> (<([a-z]+[^>]*)>)(.*)(</\2>)
>> да и знающего человека заставляет невольно поморщить нос

Вроде простенькое выражение, просто группировок побольше поставили
Хотя бы /(?:(?:\s?\{\d\/\d\}\s)([\w\d\+\-\*]*))+?(?:\s(?:->|->|=)\s)(?:(?:\s?\{\d\/\d\}\s)([\w\d\+\-\*]*))+?(?:\s===(?:>|>){3})/
Мне всегда казалось, что прочитав регулярное выражение такого типа, можно призвать сатану.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Звездочка жадная, съест закрывающий тег и не подавится
>> (<([a-z]+[^>]*)>)(.*)(</\2>)
Немного не верно. Правильнее будет:

(<([A-Za-z](?:[A-Za-z0-9:-]*[A-Za-z0-9])?)[^>]*>)(.*)(</\2>)
Иначе аттрибуты искать будет в закрывающем тэге.

А вообще нужно еще корректно описать формат аттрибутов, а не с помощью [^>]*.
Да и с вложеными тегами облажаться можно. Короче, прописная истина: использовать регулярные выражения для разбора xml — себе дороже.
Вы, конечно, правы. Это простой пример, который я намеренно не стал усложнять, чтобы не пугать читателя с первых строк :-)
А на счёт парсинга html/xml регулярками интересные мысли высказал автор соседнего поста: habrahabr.ru/post/171667/
Это да… а вообще если знать точную структуру xml, то парсить регулярками не сложно.

Вообще, писал этот комментарий сразу после трехчасовой работы над грамматикой для lex/yacc, поэтому мои примеры несколько предвзяты.
Оххх.
(<([a-z]+[^>]*)>)(.*)(</\2>) -> (<([a-z]+[^>]*)>)(.*?)(</\2>)

Но вообще парсить HTML регулярками черевато :)
Спасибо. На счёт парсинга HTML — интересные мысли в соседнем посте: habrahabr.ru/post/171667/
Да не за что, жадность — первое на чем вечно накалываешься :)

О парсинге HTML, тут кабэ такая мыслишка — я не говорю о том, что это невозможно регулярками — они неплохо с этим справляются и частенько парсеры внутри себя их и используют.

Я о том, что в реальном мире HTML вполне вероятно может оказаться сломанным и все пойдет плохо. Суть парсеров в том, что их писали реально мозговитые ребята (уж точно поумнее меня) и они с этой проблемой так или иначе боролись. Тесты, документация и т.д. — это блин непросто все. Так что лучше взять готовое.
/(<([a-z]+[^>]*)>)(.*)(</\2>)/

Если уж пишете статью, то пользуйтесь

А вообще что бы читать свободно регулярки надо их писать, какие-то жалкие 10 000 часов тренировок и прочитать любое выражение не составит труда :)
Чаще всего разработчики в своём редакторе видят регулярные выражения без всякой подсветки, я стремился вызвать соответствующие ассоциации :-)

За сервис спасибо, я о таком не знал.

Товарищ в этом комментарии оставил пример — habrahabr.ru/post/175179/#comment_6086545 — мне сходу не удаётся понять логический смысл, надо разбираться, а вам? )
Я сходу могу увидеть только общую структуру и сразу вижу лишние группировки и повторяющиеся альтернативы, но опознать строчку, которую оно покрывало, не могу. Имхо это либо недоделанная или намеренно перегруженная регулярка.

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

А подсветку я сделал исключительно для статей на хабре.
Ты не можешь распарсить [X]HTML при помощи регулярных выражений. Потому что HTML не может быть распарсен при помощи регулярных выражений. Регулярные выражения это не тот инструмент, который может быть использован для того, чтобы корректно распарсить HTML. Как я уже неоднократно ранее отвечал в вопросах про HTML и регулярные выражения, нельзя скормить регулярке HTML. Регулярные выражения являются инструментом, недостаточно продвинутым для того, чтобы понять все конструкции, используемые в HTML. HTML — не регулярный язык и не может быть разобран регулярными выражениями. Запросы регулярных выражений не приспособлены для разбивки HTML на осмысленные части. так много раз но я не понимаю. Даже навороченные нерегулярные регулярные выражения Перла не в силах справиться с задачей парсинга HTML. Ты никогда меня не сломишь. HTML является языком достаточной сложности, чтобы его нельзя было разбирать при помощи регулярных выражений. Даже Джон Скит не может распарсить HTML регулярными выражениями. Каждый раз, когда ты пытаешься распарсить HTML регулярными выражениями, дитя дьявола умывается кровью девственниц, и русские хакеры взламывают твой сайт. Разбор HTML регулярками призывает нечестивые души в обитель живых. Регулярные выражения и HTML сочетаются также, как любовь, брак и ритуальное детоубийство. Его <center> не сдержит уже слишком поздно. Совместная сила регулярных выражений и HTML в одном концептуальном пространстве разметет твой разум как водянистые какашки. Если ты парсишь HTML регулярными выражениями, ты склоняешься перед Ними и их богохульными путями которые обрекли нас всех на нечеловеческие муки во имя Того чье Имя не может быть выражено в Основной Мультилингвальной Плоскости, он грядет. HTML-и-регулярки разжижит нервы разумных пока ты наблюдаешь твоя душа иссыхает в атаке ужаса. Парсе̿̔̉ры HTML на регулярках это рак убивающий Хабрахабр слишком поздно слишком поздно нас не спасти проступок ди͡тя гарантирует регулярки поглотят всю живую плоть (кроме HTML, как уже ранее предрекалось) боже милостивый помоги нам как кто нибудь может пережить эту кару парсить HTML регулярками обрекло человечество на вечность ужасающих пыток и дыр в безопасности использование регулярок как инструмента для обработки HTML создает брешь между этим миром и кошмарной обителью и͒ͪс͛ͫпорченных сущностей (как сущности SGML, только более испорченные) даже беглый взгляд на мир парсеров HTML на регулярках мгновенно перенесет сознание программиста в мир нескончаемого плача, он грядет, тлетворная склизкая регулярная зараза пожрет твой HTML-парсер, приложение и существование всего времени как Visual Basic только хуже он грядет он грядет не противься он гряд̡ет ̕его нече̨сти͞вое сџяњµе разру҉шает разу̍̈́̂̈́мне, теги HTML те͠ќ̧у͘т џ̶з тв̡ои͟х гла͢з̸ ̛к̕ак жидкая боль, песнь парсинга регу̸лярными выражениями затмит глас смертных со сферы я вижу ты видµшь ̲͚̖͔̙э̩́т̲͎̩̱͔́̋̀∆ оно прекрасно последняя капля лжи людской ВСЕ ПОТЕ͖̩͇̗̪̏̈́РЯНО ВСЕ ПОТЕРЯНО пон̷и он грядет он гр̶̮ядет он грядет ich or permeates все МОЕ ЛИЦО МОЕ ЛИЦО бᵒже нет НЕТ Н∑Е̼∑Т ЊЂТ прекрат *̶͑̾̾​̅ͫ͏̙̤g͇̫͛͆̾ͫ̑͆l͖͉̗̩̳̟̍ͫͥͨe̠̅s ͎a̧͈͖r̽̾̈́͒͑eэ̑ͧ̌т˚ͨç∂̘̝̙̃ͤ͂̾̆ нZA̡͊͠͝LGΌ Э†Оͮ̂҉̯͈͕̹̘̱ ТО͇̹̺ͅН̴Ɲ̳ ̘͖́̉ ͠∏̯͍̭0̚​Н̐И̡ 0͖́̉ ͠Н̯͍̭ Г̸̡̪̯ͨ͊̽̅̾̎P̬̩̾͛ͪ̈́̀́͘ ̶̧̨̱̹̭̯ͧ̾ͬR̷̨̙̲̝͖̥̫͎̭ͭ̏ͥͮͯ̿̔̀͟∆̲̖͊̒ͪͩͬͮ̚̚͜͏̮̪̝͍∑̴̟̟͙ͬͮ̚̚͜͏̞ͩ͌͝†̸̡̯͍̭̪̯ͨ͊̽̅̾̎



А почему бы, кстати, не использовать XML-парсер? [ оригинал ]
безысходность
Это же прекрасно!
В Komodo IDE есть прекрасный инструмент для анализа и написания RegExp. Подсветка синтаксиса присутствует. Отличная штука.
Кто сходу скажет что делает данное выражение? И какова сфера его применения?
(/([a-z0-9_-]+)/([a-z0-9_-]+))

Кстати выше упоминался сервис www.debuggex.com. Не совсем удобен. Да конечно хорошо что визуально показывает. Но с данным выражением не справился до конца. Да и ни один из сервисов не отработал так как нужно кроме. gskinner.com/RegExr/
Сходу: два начинающихся со слешей наборов символов из диапазона a-z, 0-9 и подчёркивания с минусом (тире).
Вариант сферы применения — парсинг URL. Часть.
Не понимаю, что такого особо непонятного/сложного в RegExp-ах, что все на них так ругаются. Да, напрягаться немного при чтении нужно, но вы же код обычный как-то читаете?
Ну я как и многие сразу бы и не сказал что этот регепс разбирает урлы выда: /type/auto/color/red/size/smail
На массив вида
Array
(
[0] => Array
(
[0] => /type/auto
[1] => /color/red
[2] => /size/smail
)

[1] => Array
(
[0] => type
[1] => color
[2] => size
)

[2] => Array
(
[0] => auto
[1] => red
[2] => smail
)

)
Т.е. вы считаете это неочевидным?
Для меня к сожалению да.
Я бы предпочёл использовать что-нибудь типа split('/'). Согласитесь, в разы понятнее.
Это конечно да. Но мне малость не удобно читать такой регепс.
Только, раз уж используйте \w — можете смело убрать и знак подчеркивания.
Вообще, кроме попыток как-то подсветить регулярку, чтобы понять, что всё-таки имелось в виду, можно её еще изначально понятнее писать.
Вот некоторые трюки (некоторые работают не во всех языках):
  • Выбирать делимитеры, которые не придётся экранировать: #http://# против /http:\/\//
  • Использовать не-бэклинкующиеся группы (?expr) в тех случаях, когда группу не нужно выцеплять: #(?https?:)?//#. Потом не придётся гадать, зачем тут эта группа.
  • Использовать именованные группы (?'name'expr) — тогда не придётся потом гадать, что эта группа выцепляет: #(?(?'proto'https?):)?//#. Только осторожно, а то возможно сумасшествия от экранирования кавычек.
  • Если вы собрались писать совсем уж монструозный регэксп, возможно стоит воспользоваться xtented-синтаксисом — там можно разбивать монстра на несколько строк и комментировать их
  • Стремиться решить задачу попроще, например, помня про незахватывающее заглядывание вперёд и назад
  • Не парсить регулярками HTML, ну про это уже писали не раз.
Раз уж речь зашла про Технопарк Mail.ru, хочу спросить: есть ли где в общем доступе ваши лекции?
в открытом доступе пока нет, но скоро (возможно, летом) будут. Есть кое-какие записи мастер-классов, они выложены на tp.mail.ru/
Понятно, спасибо.
Просто есть интересные курсы, я бы послушал.
По совпадению, часом позже после этой статьи, опубликовал свою статью про использование регекспов, чтобы распарсить строчку версии программы, составленную из 4 чисел, на составляющие, созданные достаточно сложными правилами. habrahabr.ru/post/175187/

Как только увидел эту статью — естественно, пошёл тестировать сервис на своём примере. Оказалось, что он не все выражения регекспов корректно отображает. Незахватывающие скобки считает группой и отображает то, что относится к другой группе, относящимся к этим незахватывающим скобкам (?=0). Вывод: охватывает не все структуры в регекспах, поэтому годится не для каждого разбора выражений.

Конкретно, вот на этом выражении он неполноценно работает:
/(\d+)\.(\d{4})\.(\d{1,2})\.([1-3]0(?=0)|0?[1-3]0$|[1-3][1-9](?!0)|0?[1-9])(\d*|$)/

И вот — расшаренная ссылка, куда я скопировал полностью примеры из статьи (20 строчек), которые у меня работает на джс-фиддле.
regexponline.com/s/we#sthash.GpUQK42k.92zmz1RF.dpuf, баги сервиса видны на (?=0) и (\d*|$);
фиддл: jsfiddle.net/spmbt/dk346/3/ с теми же примерами.

К вопросу о читабельности. В отличие от подхода этого сервиса, я представил регекспы в структурированном виде, прямо на фиддле, отчего можно оценить, насколько удобнее они читаются. И есть несколько примеров более сложных выражений в самой статье, которые со структуризацией читаются не намного сложнее. Подход сервиса, даёт понимание таких спллошных выражений — не хватает корректной работы с (?=x), (?!x),…

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

Большое спасибо за фидбек! Баг действительно был, он устранён.

С проблемой читабельности я тоже сталкивался не раз, как один из возможных вариантов решения сделал кнопку «Expand regex» — попробуйте. Буду рад идеям об улучшении этой самой читабельности.
Немного не по теме, но осмелюсь предложить посмотреть в сторону
www.regexbuddy.com/

Это офлайновая (под Windows) программа-редактор RE, но с богатым функционалом.
Меня в ней особенно подкупил режим отладки с возможностью сравнить по эффективности разные RE. Плюс подробная справка (на английском) по программе, регэкспам, и режимам отладки (с наглядными примерами).
Последняя версия вышла в марте.
Рекомендую. Правда удовольствие не бесплатное.

До этого пользовался различными онлайн вариантами и плагинами к Eclipse IDE. Теперь только «regexbuddy».
Вы правильно осмелились, ничего лучше не видел, как в плане анализа имеющихся regexp, особенно со всякими извращениями и с элементами синтаксиса, которые ты частенько забываешь, так и при создании / отладки. Однозначный must have.
Да, программа великолепная. Жаль, что только под винду :(
Еще я в ней люблю поиск и замену по регулярному выражению в файлах, она делает это быстро и четко.
Некорректно обрабатывается удаление тестируемых строк — они не исчезают из таблицы снизу. Может есть какое-то магическое действие, но я его не нашел.
Да, баг. Спасибо, поправлю. В качестве временного решения можно нажимать F5 для перезагрузки страницы — это поможет.
Сработало, когда отредактировал единственную оставшуюся строку.
Это я уже баг успел пофиксить.
1. Через некоторое время балования перестали работать кнопки добавления строки и редактирования регулярки. Помогла только перезагрузка страницы
2. Если я делал свою регулярку, потом решил посмотреть другие примеры, то хотелось бы вернуться в свою — в этот раз у меня не получилось… :(
спасибо. На счёт первого постараюсь выяснить, что могло случиться. Если у вас появится дополнительная информация как воспроизвести баг, напишите, пожалуйста. На счёт второго да, надо подумать, как лучше сделать.
Сунул ему простейшую регулярку… Ой. :)
Кстати, как ввести новое регулярное выражение, не пользуясь мышкой? При переходе по табу на кнопку ok возвращается старое.
чтобы ваша простейшая регулярка поместилась на экран, надо уменьшить масштаб браузера по ctrl+- :-)
там сейчас такая логика, что изменения в textarea отменяются при потере фокуса. Когда вы таб нажимаете, текстареа теряет фокус и изменения дискардятся. Видимо, надо придумать что-то более интуитивно понятное.
ctrl enter сделайте :)
и cmd+return тогда уж тоже!
У меня тоже мак, но я не воспользовался случаем выпендриться… ой, нет, только что воспользовался =)
Кстати, это RFC 2822 conformant регулярка для e-mail из Swift Mailer :)
Там регулярки генерируются по частям в соответствии с ABNF из RFC, я сгенерированную сдампил.
А как добавить тестовую строку новую, если я до этого все удалил?
Раз уж можно давать подвыражениям имена, было бы неплохо иметь возможность их(подвыражения) редактировать отдельно. Тогда запись регулярного выражения станет похожа на небольшую программу или набор предложений формы Бэкуса—Наура. А итоговое полное выражение — результат препроцессинга: подстановки определенных в другом месте подвыражений с опциональным сохранением их имен.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории