Почему люди защищают синтаксис регулярных выражений?

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

Синтаксис регулярных выражений очень ОЧЕНЬ компактен, почти слишком компактен, чтобы быть хорошим. Это похоже на игру в гольф, и все согласны с тем, что игра в гольф — не очень хорошая вещь в рабочем коде. Однако большинство людей принимают синтаксис регулярных выражений, который кажется... по меньшей мере противоречивым.

Итак, теперь некоторые распространенные способы защиты, которые можно услышать, включают:

  • Ответ: он компактный

  • Возражение: разве мы не согласны в наши дни с тем, что код должен быть грамотным, а такая переменная, как «клиент», лучше, чем «с»?

  • Ответ: это "язык домена"

  • Возражение: как насчет всех очень простых для понимания, некомпактных, незашифрованных и, осмелюсь сказать, симпатичных предметных языков, таких как SQL или LINQ?

  • Ответ: его легко понять, если вы его знаете.

  • Против: большинство отличных языков легко понять, даже если вы никогда не использовали их раньше. Например, любой может очень легко погрузиться в Python, даже если он никогда не видел его раньше. И почему люди защищают Regex, когда на него так сложно смотреть, а потом продолжают жаловаться на круглые скобки в Lisps?

Хорошо, теперь все стараются быть оригинальными и честными, а не просто вытаскивать те же самые старые механические ответы, которые программисты использовали 20 лет назад для разработки регулярных выражений. Если вы действительно не верите, что они действительны в наши дни.


Редактировать: Для справки: я знаю Regex много лет назад, часто использую их даже сегодня и, возможно, даже грущу их. Однако у меня внезапно возникло ощущение, что, возможно, пришло время пересмотреть то, что я принял за «истину» о регулярных выражениях, и взглянуть на них с современной точки зрения. В основном из-за того, что вопросы о принципах необходимы для дальнейшего развития, и из-за того, что так много новичков яростно жалуются на них, они не могут быть просто правильными, поэтому я решил попытаться встать на место новичка и рассмотреть некоторые положительные моменты. против регулярного выражения.

Что касается субъективности, я не думаю, что это менее субъективно ИЛИ менее связано с программистами, чем Шутки о программистах из повседневных вещей. Напротив, это очень связано с программистом.

Что касается аргументативности, в этом суть вопроса. Чтобы получить хорошие аргументы за и против устаревшего синтаксиса регулярных выражений, которые могут помочь новичкам действительно понять больше о том, почему регулярные выражения такие, какие они есть, и, что еще лучше, надеюсь, заставить какого-нибудь новичка придумать лучшее решение, которое старомодные США не могут видеть, потому что мы ослеплены «крутизной» регулярных выражений.


Цитата:

Документация Perl 5.10 для регулярных выражений превратилась в кучу нечитаемой чепухи, потому что в синтаксис вкралось так много дурацких функций, что никто больше не может написать для него толковую документацию.

Вы пытаетесь сказать, что регулярное выражение стало неподдерживаемым? Что ж, тогда, как хорошие программисты, должны ли мы рассмотреть возможность их рефакторинга? Может быть, очистить и попробовать, как мы сделали с некоторыми другими технологиями?


person Robert Gould    schedule 05.11.2008    source источник
comment
Указание, если вы знаете регулярное выражение, также было бы неплохо. Под знать я подразумеваю что-то на уровне способности отличить NFA от DFA.   -  person Tomalak    schedule 05.11.2008
comment
пожалуйста, закройте этот вопрос, не связанный с программированием.   -  person zamfir    schedule 05.11.2008
comment
SQL красивый доменный язык?   -  person Cheery    schedule 05.11.2008
comment
Zamfir это не так, с программированием не связано. Это полностью о программировании и во многих смыслах. Нет необходимости объявлять что-либо, что не решает насущную проблему, неприемлемым, потому что в SO полно подобных вопросов, и сообщество в целом приняло такие вещи.   -  person Robert Gould    schedule 05.11.2008
comment
@Cheery, ну, я много и просто работаю с SQL, и я пришел к выводу, что это красиво. Но вы, вероятно, правы, когда я думаю об этом, это не очень красиво, просто чтобы вы видели, насколько мы, программисты, больны :)   -  person Robert Gould    schedule 05.11.2008
comment
+1 за редактирование, которое устанавливает контекст вопроса, способствует духу неустанного улучшения и использует в одном и том же абзаце как грок, так и яростно.   -  person Adam Liss    schedule 05.11.2008
comment
Каков источник этой цитаты о 5.10?   -  person brian d foy    schedule 08.11.2008
comment
это цитата из одного из ответов ниже, но сейчас не могу найти.   -  person Robert Gould    schedule 08.11.2008


Ответы (19)


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

«Как насчет всех очень простых для понимания, некомпактных, не загадочных и, осмелюсь сказать, красивых доменных языков, таких как SQL или LINQ?»

Я думаю, что хороший способ ответить на этот вопрос — спросить, как бы вы использовали английский язык для объяснения регулярного выражения?

<TAG\b[^>]*>(.*?)</TAG>

Ищите "‹TAG" границу слова ноль или более чего-то, что не является '>', за которым следует '>' запомнить ноль или более чего-то, останавливаясь на первом "‹/TAG›"

Это довольно простое регулярное выражение. Действительно ли английская форма легче для понимания? Могли бы вы сделать лучше?

Регулярные выражения трудно читать, но то, что вы хотите от них, может быть столь же трудно объяснить.

person he_the_great    schedule 05.11.2008
comment
+1: хорошие моменты. Если это было трудно написать, это должно быть трудно понять. Как ты думаешь, почему они называют это кодом!? - person Adam Liss; 05.11.2008
comment
+1 отсюда тоже. Спасибо за хорошее замечание! - person Robert Gould; 05.11.2008
comment
Вот если бы ты не объяснил, что это вообще не имело бы смысла! - person RCIX; 05.09.2009
comment
@RCIX Это только в том случае, если вы не знаете регулярное выражение. - person he_the_great; 07.09.2009
comment
Сыграть здесь адвоката дьявола; как бы вы заменили этот код элегантной альтернативой без регулярных выражений? - person Rebecca; 30.11.2011
comment
Точно. Кроме того, если вы действительно хотите, вы можете включить режим IgnorePatternWhitespace и красиво разбить ваше регулярное выражение по структуре на несколько строк и прокомментировать его, как я делаю, если регулярное выражение очень сложное. - person Matthew Lock; 31.05.2012

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

person Adam Liss    schedule 05.11.2008
comment
Я недостаточно умен, чтобы придумать лучшее решение, но я очень надеюсь, что кто-то умный это сделал. - person Robert Gould; 05.11.2008
comment
Брэд Гилберт, я собирался сказать это. - person Axeman; 05.11.2008
comment
Я не думаю, что краткость является достоинством, когда она мешает пониманию. Вот попытка сделать BNF на C++: boost.org/doc /libs/1_35_0/libs/spirit/index.html - person Mark Ransom; 05.11.2008
comment
Если я что-то не упустил, грамматики Perl6 мало что сделают для улучшения синтаксиса регулярных выражений. Однако они сделают многое для улучшения их использования программистами. - person Michael Carman; 06.11.2008

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

  • Это совсем не похоже на игру в гольф. Я не уверен в вашей связи там. Почему бы не жаловаться на указатели или что-то еще, используя тот же аргумент?

  • Компактность регулярных выражений не имеет ничего общего с плохими именами переменных. Переменная с именем c может быть чем угодно. Синтаксис регулярных выражений не является ни двусмысленным, ни расплывчатым. Он точно описывает его структуру.

  • Это ДСЛ. Так что, если это так? Вы когда-нибудь пытались делать сложные вещи в SQL? Тоже большой беспорядок. Если для одних и тех же вещей требуется больше ввода и больше синтаксиса, это не улучшит ситуацию. Большинство людей, которых я учу, имеют проблемы с регулярными выражениями, потому что они не привыкли думать и разрабатывать шаблоны, а не потому, что синтаксис экзотичен.

  • Это легко понять, когда вы это знаете. Что ж, это так. Электроинструменты не оптимизированы для новичков или людей, не желающих учиться. Я не жалуюсь на круглые скобки Лиспа, но я не возражаю против синтаксиса регулярных выражений.

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

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

person brian d foy    schedule 05.11.2008
comment
Извините за неясность, да, я знаю их, использую их и даже осмелюсь сказать, что они мне нравятся. Однако я пытаюсь найти веские аргументы против своих контраргументов, и ваши до некоторой степени верны. - person Robert Gould; 05.11.2008
comment
Это немного похоже на игру в гольф. например \d используется в гольф по сравнению с нотацией POSIX [[:digit:]]. Тем не менее, я бы не хотел видеть подробную форму для *? квантор. - person Michael Carman; 06.11.2008
comment
Я не думаю, что это вообще похоже на гольф. \d не для того, чтобы запутать или использовать функцию умным, непреднамеренным или неожиданным образом. Классы символов POSIX не являются синонимами классов символов Perl, а в некоторых случаях они отличаются. Effectiveperlprogramming.com/blog/991 - person brian d foy; 14.03.2012
comment
Второй пункт списка, касающийся переменной с именем c, весьма силен. - person Ray Toal; 12.07.2016

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

person Community    schedule 05.11.2008
comment
Хорошо, это ОЧЕНЬ ХОРОШИЙ ответ, лол :) - person Robert Gould; 05.11.2008

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

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

person Tony Arkles    schedule 05.11.2008
comment
+1 Это хороший момент, о котором я забыл, и он дает действительный приоритет для странного синтаксиса, который выходит за вычислительные пределы десятилетий назад. - person Robert Gould; 05.11.2008

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

person Aditya Mukherji    schedule 05.11.2008
comment
Да, это очень хороший аргумент в пользу Regex! Я полностью с тобой согласен - person Robert Gould; 05.11.2008

Часть проблем с регулярными выражениями заключается не в самом языке, а в том, для чего люди пытаются их использовать. Они будут писать строки и строки регулярных выражений, хотя на самом деле им нужен довольно простой синтаксический анализатор.

Регулярные выражения отлично подходят для простого и умеренно сложного сопоставления подстрок и извлечения данных. Но в какой-то момент сложности надо просто выковыривать компилятор-компилятор и писать настоящий парсер. Я думаю, что многие люди не понимают, что регулярные выражения в первую очередь предназначены для сопоставления, а не для синтаксического анализа.

person user21714    schedule 05.11.2008
comment
Слышу, слышу! Регулярные выражения — один из моих любимых инструментов, но они не подходят даже для 10% того, что я делаю. - person Dave Sherohman; 05.11.2008

Вы должны смотреть на регулярные выражения как на высококлассные электроинструменты (и я имею в виду электроинструменты в смысле строительной отрасли).

Если вы строите небольшой рабочий стол для своего сарая, вы не достаете гвоздезабивной пистолет, бензопилу и промышленный фрезер. Вы используете пилу, несколько гвоздей и молоток.

Точно так же вы не построите 30-этажное здание без крана где-то там.

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

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

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

person paxdiablo    schedule 05.11.2008
comment
+1 они в некотором смысле электроинструменты. Но, может быть, нам стоит сделать более безопасные инструменты? - person Robert Gould; 05.11.2008

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

person Frederic Morin    schedule 05.11.2008
comment
Вот почему я склонен думать о регулярных выражениях как о нерегулярных выражениях... - person IIsi 50MHz; 07.12.2010

Другие намекали на это, но следует прямо заявить:

Обычные языки отличаются от языков программирования. Они ближе к математической записи.

Компактность и причудливость являются скорее результатом попытки добиться точной записи символов ASCII, чем преднамеренной попыткой добиться краткости или запутанности.

person Michael Carman    schedule 06.11.2008

Я думаю, что SQL-подобный язык регулярных выражений был бы интересным проектом. Я бы хотел, чтобы кто-то создал это.

Почему бы нет языка, на котором можно писать

LOOK FOR "<TAG"

THEN WORDBOUNDARY THEN ZERO-OR-MORE NOT('>') FOLLOWED-BY '>'

THEN ZERO-OR-MORE SOMETHING REMEMBERED

THEN NEAREST "</TAG>"

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

Наверняка набор «людей, которым нужно использовать такое сложное выражение» в значительной степени совпадает с набором программистов, которым ежедневно приходится иметь дело с такими же сложными и даже более сложными вещами?

person AmbroseChapel    schedule 05.11.2008
comment
+1 Согласен, я был бы очень рад иметь что-то подобное. Ведь даже новый синтаксис, если он хороший, может очень быстро уловить. Прекрасным примером этого могут быть LINQ и Ruby. Обе очень быстро прижились (менее чем за год) благодаря тому, что были хорошенькими. - person Robert Gould; 05.11.2008
comment
Урргх - извините, но это выглядит ужасно. Я бы сказал, используйте синтаксис пробелов/комментариев, чтобы вы могли логически разделить его и прокомментировать все, что может сбить с толку любого, кто поддерживает код (включая вас через год;) - person Hamish Downer; 05.11.2008
comment
О, вот это было бы неплохо. форма SQL (язык строковых запросов)? :D - person RCIX; 05.09.2009
comment
Конечно, я имею в виду, сколько времени потребуется, чтобы создать макрос на основе регулярных выражений, чтобы код сгенерировал обычный код регулярных выражений из недавно определенного SQL-подобного синтаксиса регулярных выражений, правильно. ;) - person micahwittman; 08.12.2009
comment
Немного похоже на COBOL - person Tino; 22.01.2013
comment
На самом деле вы можете создать инструмент, который одним щелчком мыши переключается между таким синтаксисом и регулярным выражением. Считайте это своего рода «интерактивной справкой», встроенной в IDE (или одноразовым веб-инструментом для ответов на вопросы «что именно делает это сложное регулярное выражение», которые возникают время от времени). Связанный: я мечтаю, что в одном из этих десятилетий у нас будет аналог Google Translate для компьютерных программ (т. е. ввод блока кода/алгоритма в javascript, вывод эквивалентного кода на Fortran или C# или описательный французский язык и наоборот). - person Jim Grisham; 28.03.2021

Pyparsing (http://pyparsing.wikispaces.com/Examples) — это библиотека Python, упрощающая напишите выражения, подобные регулярным выражениям, которые легко читаются, например эти строки, которые будут анализировать «Hello, World!»:

from pyparsing import Word, alphas
greet = Word( alphas ) + "," + Word( alphas ) + "!"
greet.parseString("Hello, World!")

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

person Brandon    schedule 05.11.2008
comment
Pyparsing больше не размещается на wikispaces.com. Перейдите на страницу github.com/pyparsing/pyparsing. - person PaulMcG; 27.08.2018

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

Затем, я думаю, возобладала идея UNIX «сделай все, что можешь, в одной строке». После улучшений в сценариях sed и grep регулярные выражения приобрели новые возможности, но сокращенные обозначения для них. Ларри Уолл включил их в Perl в качестве общего инструмента для разбора текста. Я предполагаю, что он сохранил компактность для однострочников, которые все еще были важны для Perl. И были сокращенные имена для общих классов символов, и еще больше мощности требовалось и давалось регулярным выражениям. Конечно, поскольку Perl также был языком модулей, синтаксис регулярных выражений также работал в блоках операторов и использовал более широко известный синтаксис.

Их включение в Java действительно заставило людей взглянуть на них, IMO. Java ничего не сделала для их размещения. И в результате выражения с обратным слешем средней сложности превратились в густые джунгли из обратных слэшей. Java дал регулярным выражениям новый рынок, если хотите, но это их самая ужасная форма. Если вы видели их и не обращали больше внимания, вы можете подумать, что регулярное выражение — это то, чего не должно быть.

Интересно, что при достаточно ясном синтаксисе многословной версии Амброуза кто-то мог бы придумать модуль для Perl, который мог бы взять подробное регулярное выражение и «скомпилировать» его в компактное регулярное выражение, понятное Perl, используя более простые регулярные выражения через overload::constants или, возможно, Parse::RecDescent грамматика.

person Axeman    schedule 05.11.2008
comment
Спасибо за довольно хорошо округленный ответ. Честно говоря, я пропустил Java много лет, и интересно, что Java, возможно, принесла регулярные выражения в массы :) - person Robert Gould; 05.11.2008
comment
Ну, я не уверен в этом, просто если я видел умеренно сложный RE, анализ которого занимает пару минут, это обычно было результатом взрыва обратной косой черты, необходимого для Java. Другие ссылки кажутся правдоподобными, если не реальными. - person Axeman; 06.11.2008

Так оно и есть... в основном по традиционным причинам, как вы правильно указали. В настоящее время

  • Переобучение и переоснащение: у него огромное количество поклонников, а его корни слишком глубоки для капитального ремонта, даже если кто-то захочет. Люди изучили тайные правила и разработали свой набор приемов, сообществ и инструментов (я подключаю Expresso).
  • Обширная поддержка. Текущий синтаксис широко поддерживается на разных платформах. Переписать такой уровень поддержки — огромная задача, даже если вы не принимаете во внимание монументальную задачу написания собственного движка и обработки всех второстепенных случаев.
  • Регистральные выражения вряд ли изменятся Наконец, что наиболее важно, регулярное выражение нельзя приравнивать к коду по отношению к коду. удобочитаемость. Лично я использую регулярное выражение экономно и для быстрых надрезов, когда его преимущества перевешивают преимущества. (например, внутренний инструмент для очистки электронной таблицы Excel клиента в формате XML, разработанном для разработчика.) Регулярные выражения не нужно поддерживать и изменять.. если они очень сложные.. замаскировать запах комментарием (и это должно быть только один раз). Если вы обнаружите, что регулярные выражения регулярно изменяются (или если никто на вашем рабочем месте не знает регулярных выражений), вероятно, это был плохой выбор, и вам следует переключиться на обычный код.

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

person Gishu    schedule 05.11.2008
comment
Очень хорошие аргументы! Спасибо, однако, если подумать, что это не спасло ни MFC, ни COBOL... Но тем не менее мы позволили регулярному выражению быть королем... странно, не правда ли? - person Robert Gould; 05.11.2008
comment
Но вы должны помнить, что преемники тех были «проще в использовании» и делали гораздо «больше с меньшими усилиями». Я думаю, что будет сложно превзойти регулярные выражения в последнем отделе, даже если вы справились с первым. - person Gishu; 06.11.2008

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

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

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

Если вас отталкивает только синтаксис, возможно, вам следует рассмотреть комбинаторы парсеров в Haskell. Они могут выражать расширенный набор одних и тех же идей и иметь более явный синтаксис.

person Edward KMETT    schedule 05.11.2008
comment
Но все языки начинались не с того, что существовали, а с целью улучшения и восполнения потребностей. Как уже упоминалось, кто придумал LINQ? - person Robert Gould; 05.11.2008
comment
Ну, в шутку, Эрик Мейер. ;) LINQ является потомком монадных понятий, расширенных для обработки сортировки и упорядочения, и они восходят к Уодлеру и происходят от понятий списка, которые вы можете проследить до SETL из 60-х годов. Мы склонны строить на том, что было раньше, а не создавать цельную ткань. - person Edward KMETT; 05.11.2008

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

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

Теперь, конечно, я постоянный пользователь регулярных выражений, поэтому я уверен, что мое удобство с ними является важной частью этого. Но моя основная проблема заключалась не в незнакомстве с ними, а в том, что они быстро становились слишком большими, чтобы охватить их всех сразу. Когда ваше 20-символьное регулярное выражение превращается в псевдоанглийское выражение размером 10 строк на 30 столбцов, становится гораздо труднее увидеть, как его части соотносятся друг с другом.

Возможно, кто-то предложит синтаксис, альтернативный регулярным выражениям, который будет более удобочитаемым, даже в сложных случаях, но я утверждаю, что такой синтаксис по своей сути потребует некоторого эквивалента вызовам подпрограмм. Мы не пишем 200-строчные блоки кода приложения с 15 слоями вложенной логики, потому что было бы монументальной задачей просто отследить его логику, не говоря уже о выяснении того, что оно на самом деле делает. Если мы собираемся преобразовать регулярные выражения в более английскую форму, то возникнет та же проблема, и нам потребуются те же инструменты для ее решения.

person Dave Sherohman    schedule 05.11.2008
comment
потребность в подпрограммах — очень хороший момент и, возможно, камень преткновения для преемника. Но с другой стороны длинные регулярные выражения сами по себе моветон, может быть - person Robert Gould; 05.11.2008
comment
В регулярных выражениях уже есть подпрограммы, но подпрограммы и аргументы названы так, что J. Random Newbie сочтет их тарабарщиной. Сначала они напомнили мне, что произойдет, если кто-то сбросит случайные данные на один из старых университетских принтеров, в результате чего он напечатает от нескольких символов до нескольких десятков листов случайных символов. Работа с регулярными выражениями похожа на работу с некоторыми эзотерическими сложными языками; все чрезвычайно лаконично и совершенно логично, читать их поначалу ужасно, но их написание дает огромное ощущение Hack Value. - person IIsi 50MHz; 07.12.2010

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

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

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

person DGM    schedule 05.11.2008

Из модуля perl Regexp::English :

Regexp::English предоставляет альтернативный синтаксис регулярных выражений, немного более подробный, чем стандартные механизмы. Кроме того, он добавляет несколько удобных функций, таких как добавочное построение выражений и связанные захваты.

    use Regexp::English;

    my $re = Regexp::English
            -> start_of_line
            -> literal('Flippers')
            -> literal(':')
            -> optional
                    -> whitespace_char
            -> end
            -> remember
                    -> multiple
                            -> digit;

    while (<INPUT>) {
            if (my $match = $re->match($_)) {
                    print "$match\n";
            }
    }
person Matthew Lock    schedule 31.05.2012

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

person DejanLekic    schedule 29.11.2011