Почему люди защищают regex синтаксис? [закрытый]

См. Документацию о потребительских свойствах.

Установите ...consumer.max-attempts=1, чтобы отключить повторную попытку.

10
задан brian d foy 7 November 2008 в 23:06
поделиться

17 ответов

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

"как насчет всего очень легкого, чтобы понять, не компактный, не загадочный и сметь я говорю что довольно доменные языки там как SQL или LINQ?"

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

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

Ищите" <ТЕГ" граничный нуль слова или больше из чего-то, что не является'>' сопровождается'>', помнят нуль или больше из чего-то, останавливая в первом" </ТЕГ>"

Это - довольно простой regex. Английскую форму действительно легче понять? Вы могли добиться большего успеха?

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

34
ответ дан 3 December 2019 в 13:09
поделиться

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

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

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

2
ответ дан 3 December 2019 в 13:09
поделиться

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

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

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

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

3
ответ дан 3 December 2019 в 13:09
поделиться

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

Я нашел, что они были однородно менее читаемы, чем эквивалентный regexes.

Теперь, предоставленный, я - обычный пользователь regexes, таким образом, я уверен, что мой комфорт с ними является значительной частью этого. Но моей основной проблемой с ними не было отсутствие близости, а скорее что они быстро стали слишком большими для принятия внезапно. Когда Ваш regex с 20 символами становится 10-line-by-30-column псевдоанглийским выражением, становится намного более трудным видеть, как части его касаются друг друга.

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

3
ответ дан 3 December 2019 в 13:09
поделиться

Это - способ, которым это... главным образом по традиционным причинам, как Вы указали правильно. Теперь

  • Переквалификация и переоборудование: это получило огромное следующее, и корни стали слишком глубокими для перестройки, даже если кто-то хочет. Люди изучили тайные правила и разработали их набор хитрых приемов, сообщества и инструменты (я включаю Экспресс).
  • Обширная Поддержка: текущий синтаксис широко поддерживается через платформы.. перезапись того уровня поддержки является огромной задачей даже при дисконтировании неподъемной задачи записи собственного механизма и обработки всех случаев края
  • Reg Exp, менее вероятно, изменится Последнее и наиболее важное, RegExp не может быть приравнен для кодирования w.r.t. удобочитаемости. Лично я использую regexp экономно и для быстрых разрезов, где его преимущества перевешивают преимущества. (например, внутренний инструмент для очистки электронной таблицы Excel клиента в формат XML, созданный - для разработчика чисто.) Regexps не должен должен быть сохраняться и изменяться.. если это очень сложно.. замаскируйте аромат с комментарием (и это должно только быть однажды). При нахождении regexp, изменяемого регулярно (или если никто больше на рабочем месте не знает regexps), это, вероятно, был плохой выбор, и необходимо переключиться на обычный код.

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

3
ответ дан 3 December 2019 в 13:09
поделиться

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

Затем я думаю, что была UNIX-do-all-you-can-in-a-single-line идея, которая вступила во владение. После улучшений sed и grep сценариев, regexes получил новые полномочия, но краткие обозначения для них. Larry Wall включил их в Perl как общий инструмент для парсинга текста. Я предположил бы, что это сохранило компактность для острот, которые все еще были важны с жемчугом. И были краткие названия классов обычного символа, и еще больше питания спросили и дали regexes. Конечно, так как Perl был также языком модулей, regex синтаксис также работал в блоках операторов, и он усилил синтаксис, который был более широко известен.

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

Интересно, что, учитывая достаточно ясный синтаксис, для подробной версии Ambrose, кто-то мог придумать модуль для Perl, который мог взять подробный regex и "скомпилировать" его в компактный regex, который Perl понимает, с помощью более простого regexes через overload::constants или возможно a Parse::RecDescent грамматика.

4
ответ дан 3 December 2019 в 13:09
поделиться

Pyparsing (http://pyparsing.wikispaces.com/Examples) является библиотекой Python, которая помогает записать подобные regex выражения, которые очень читаемы, как эти строки, которые проанализируют "Привет, Мир!":

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

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

5
ответ дан 3 December 2019 в 13:09
поделиться

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

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

LOOK FOR "<TAG"

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

THEN ZERO-OR-MORE SOMETHING REMEMBERED

THEN NEAREST "</TAG>"

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

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

5
ответ дан 3 December 2019 в 13:09
поделиться

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

9
ответ дан 3 December 2019 в 13:09
поделиться

Другая проблема с regex состоит в том, что существует много ароматов его. .NET regex по сравнению с php regex по сравнению с другим regex, весь взгляд одинаково, но не дает тот же результат (иногда никакой результат вообще).

6
ответ дан 3 December 2019 в 13:09
поделиться

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

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

8
ответ дан 3 December 2019 в 13:09
поделиться

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

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

11
ответ дан 3 December 2019 в 13:09
поделиться

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

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

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

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

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

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

6
ответ дан 3 December 2019 в 13:09
поделиться

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

15
ответ дан 3 December 2019 в 13:09
поделиться

Ваши контрдоводы являются показными. Вы знаете regex синтаксис, или Вы спорите от точки незнания? Это - важный момент для установления предвзятости.

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

  • Компактность регулярного выражения не имеет никакого отношения к плохим именам переменной. Переменная, названная c, могла быть чем-либо. regex синтаксис не неоднозначен и не неопределенен. Это точно описывает свой шаблон.

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

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

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

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

17
ответ дан 3 December 2019 в 13:09
поделиться

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

26
ответ дан 3 December 2019 в 13:09
поделиться

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

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

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

6
ответ дан 3 December 2019 в 13:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: