Когда я должен предпочесть регулярное выражение встроенным строковым функциям? - PullRequest
11 голосов
/ 08 июня 2011

Некоторые говорят, что я должен использовать регулярные выражения всякий раз, когда это возможно, другие говорят, что я должен использовать его как можно меньше. Есть ли что-то вроде «Perl Etiquette» в этом вопросе или просто TIMTOWTDI?

Ответы [ 7 ]

10 голосов
/ 08 июня 2011

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

  • Нет ли встроенной строковой функции, которая справляется с этим относительно легко?
  • Нужно ли захватывать подстроку?группы?
  • Нужны ли мне сложные функции, такие как оглядка или отрицательные множества?
  • Собираюсь ли я использовать наборы символов?
  • Будет ли использование регулярных выражений делать мой код более

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

8 голосов
/ 08 июня 2011

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

Подведем итог: если есть надежный анализатор, используйте его вместо регулярных выражений;100% времени.Никогда не рекомендуй ничего новичку.Итак -

Не делайте

DOS

  • Использовать substr , index и rindex гдеуместно, но признавать, что они могут «не очень», поэтому их лучше использовать, когда бенчмаркинг показывает их превосходство над регулярными выражениями;во многих случаях регулярные выражения могут быть на удивление быстрыми.
  • Используйте регулярные выражения, когда нет хорошего синтаксического анализатора, и написание грамматики Parse :: RecDescent излишне, слишком много работы или будетслишком медленный.
  • Используйте регулярные выражения для одноразового кода, например однострочные, на известных / предсказуемых данных, включая HTML / CSV, ранее запрещенный для использования регулярных выражений.
  • Имейте в видуальтернатив для более крупных задач, таких как P :: RecD, Parse :: Yapp и Marpa .
  • Держите свой собственный совет .Perl должен быть веселымДелай что хочешь;просто будьте готовы получить травму, если вы жалуетесь, когда не следуете советам, и это идет вбок.: P
4 голосов
/ 08 июня 2011

Хотя я бы классифицировал это как слишком самоуверенное для SO, я выскажу свою точку зрения.

Используйте регулярное выражение, если строка:

  • "Too Dynamic" (Строка может иметь много вариаций, поэтому использование библиотеки строк будет громоздким.
  • "Содержит шаблоны", если в строке есть подлинный шаблон(и может быть простым как 1 символ или группа символов) это то, где (я чувствую) регулярное выражение превосходит.
  • «Слишком сложный» Если вы обнаружите, что объявляете целый функциональный блок только для того, чтобы сделать что-то одношаблон может сделать, я вижу, что стоит использовать регулярные выражения (однако, см. также «Слишком сложный» ниже).

Не , а не используйте регулярное выражение, чтобы:

  • «Быстро» Рассмотрим издержки, связанные с раскруткой библиотеки регулярных выражений при получении информации непосредственно из строки.
  • «Слишком сложный» Хороший код не является 'т всегда короткий. Если вы начинаете делать огромный узор, чтобы обойти несколько линийкода, это хорошо, но имейте в виду, что это рискует читабельностью.Возвращение к этому фрагменту и попытка снова обернуть его вокруг, возможно, не стоит того, чтобы использовать метод простой Джейн.
4 голосов
/ 08 июня 2011

Я не знаю ни одного "этикета" по этому поводу.

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

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

Только мои два цента.

3 голосов
/ 08 июня 2011

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

2 голосов
/ 08 июня 2011

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

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

Это будет зависеть от того, что вы собираетесь делать.Конечно, пожалуйста, не используйте регулярные выражения для анализа (особенно HTML и т. Д.)

2 голосов
/ 08 июня 2011

Perl - отличный язык для регулярных выражений. У него, честно говоря, один из величайших парсеров любого языка, поэтому вы видите так много ответов "use regex". Однако я не уверен, что такое отвращение к регулярным выражениям.

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

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