Подтвердить что ты не робот

Должен ли я избегать регулярных выражений?

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

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

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

Я хочу, чтобы информация от мастеров в сообществе SO делилась своими идеями со мной. Спасибо, ребята!

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

сверхраздутый? Нет. Они чрезвычайно мощные и гибкие.

злоупотребляют? Абсолютно. В частности, когда дело доходит до разбора HTML (который часто появляется здесь).

Это еще один из сценариев "правильного инструмента для работы". Некоторые заходят слишком далеко и пытаются использовать его для всего.

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

Но ручной код будет почти всегда быстрее. Хорошим примером этого является Ввод char в строку java для каждого N символов. Регулярное решение является термином, но имеет некоторые проблемы, которые петля, написанная вручную, не имеет и значительно медленнее.

Ответ 4

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

Нет ничего тяжелого в регулярных выражениях. Самый распространенный способ, с которым программисты сталкиваются с проблемами с использованием регулярных выражений, - это то, что они пытаются сделать слишком много с одним регулярным выражением. Если вы используете регулярные выражения для того, что они предназначены (простое сопоставление шаблонов), вам будет сложно записать процедурный код, который более эффективен, чем эквивалентное регулярное выражение. Учитывая приличное знание регулярных выражений, регулярное выражение занимает гораздо меньше времени для записи, его легче читать и можно вставлять в такие инструменты, как RegexBuddy для визуализации.

Ответ 5

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

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

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

Ответ 6

"Когда у вас есть молот, все выглядит как гвоздь".

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

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

Ответ 7

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

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

Ответ 8

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

Серьезно, я не понимаю. Это инструмент, как любой другой. Если вам нужен простой веб-сайт с некоторым текстом, вам не нужен PHP/ASP.NET/STG44. Тем не менее, не следует обсуждать, следует ли избегать этого. Как странно.

По моему опыту, RegEx - это, наверное, самый полезный инструмент, с которым я когда-либо сталкивался как разработчик. Это самый полезный инструмент, когда дело доходит до проблемы безопасности №1: анализ пользовательского ввода. Я спас мне часы, если не дни кодирования, и создаю потенциально глючный (читай: crappy) код.

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

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

Как упоминалось выше, разбор HTML с RegEx похож на русскую рулетку с полностью заряженным оружием. Не переусердствуйте, включая RegEx.

Ответ 9

сверхраздутый? Нет

Недостаточно использовать? Да

Ответ 10

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

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

Ответ 11

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

Ответ 12

По моему мнению, они слишком много злоупотребляют людьми (у меня было это обсуждение несколько раз на SO).

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

Вам нужно только посмотреть пример, например, регистрационный номер автомобиля в Западной Австралии. RE будет

re.match("[1-9] [A-Z]{3} [0-9]{3}")

в то время как код для проверки этого будет значительно длиннее, либо в простой версии 9-if, либо в немного лучшей версии цикла.

Я почти никогда не использую сложные RE в моем коде, потому что:

  • Я знаю, как работают двигатели RE, и я могу использовать знания домена для кодирования более быстрых решений (этот вариант 9-if почти наверняка будет быстрее, чем цикл компиляции/выполнения REV); и
  • Я нахожу код более читабельным, если он ломается и комментируется. Это не так просто с большинством RE (хотя я видел тот, который позволяет встроенные комментарии).

Я видел, как люди предлагают использовать RE для извлечения подстроки фиксированного размера в фиксированном месте. Почему эти люди не просто используют substring() вне меня. Моя личная мысль заключается в том, что они просто пытаются показать, насколько они умны (но редко работают).

Ответ 13

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

Ответ 14

Существует очень веская причина использовать регулярные выражения в языках сценариев (например, Ruby, Python, Perl, JavaScript и Lua): синтаксический анализ строки с тщательно оптимизированным регулярным выражением выполняется быстрее, чем эквивалентный пользовательский цикл while, который сканирует строку символ за символом. Для скомпилированных языков (таких как C и С++, а также С# и Java большую часть времени) обычно выполняется обратное: пользовательский цикл while выполняется быстрее.

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

Ответ 15

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

Это система для решения проблем синтаксического анализа.

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

Ответ 16

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


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

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

Ответ 17

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

Ответ 18

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

Это не означает, что они не злоупотребляют. Единственный раз, когда string.match(/\?/) Лучше, чем string.contains('?'), Если он значительно читается с окружающим кодом или если вы знаете, что .contains реализовано с регулярными выражениями в любом случае

Ответ 19

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

glVector3f (-1.0f, 1.0f, 1.0f); → glVector3f (center.x - 1.0f, center.y + 1.0f, center.z + 1.0f);

Без регулярного выражения это боль, но с регулярным выражением...

s/glVector3f\((.*?),(.*?),(.*?)\)/glVector3f(point.x+$1,point.y+$2,point.z+$3)/g

Высокий.

Ответ 20

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

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

Если ожидается, что условия будут развиваться во что-то, что менее просто сделать с помощью обычного вызова String.contains("?"), тогда было бы проще его кодировать с помощью простого простого регулярного выражения с самого начала.

Ответ 21

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

Я обычно слышу два аргумента против регулярных выражений: 1) Они вычислительно неэффективны, и 2) Их трудно понять.

Честно говоря, я не могу понять, как законные претензии.

1) Это может быть справедливо в академическом смысле. Сложное выражение может удвоиться на себя, может быть, несколько раз. Действительно ли это имеет значение? Сколько миллионов вычислений в секунду может сделать серверный процессор в эти дни? Я имел дело с некоторыми сумасшедшими выражениями, и я никогда не видел, чтобы regexp был шеей бутылки. На сегодняшний день это взаимодействие с БД, за которым следует пропускная способность.

2) Тяжело около недели. Самое сложное регулярное выражение не сложнее, чем HTML - это просто проблема знакомства. Если вам нужен HTML один раз в 3 месяца, вы получите его 100% каждый раз? Работайте с ними ежедневно, и они так же понятны, как и любой другой синтаксис языка.

Я пишу программу проверки. REGEXP - вторая натура. Каждая пятая строка кода имеет регулярное выражение, и для меня жизнь я не могу понять, почему люди делают большие сделки по ним. Я никогда не видел, чтобы реджиксп замедлял обработку, и я видел, как даже самые скучные "программисты" подбирают синтаксис.

Regexp являются мощными, эффективными и полезными. Зачем их избегать?

Ответ 22

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

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

Из памяти в wikipedia есть достойная статья о регулярных выражениях и основных алгоритмах.