Некоторые говорят, что я должен использовать регулярное выражение, когда это возможно, другие говорят, что я должен использовать его по крайней мере, насколько это возможно. Есть ли что-то вроде "Perl Etiquette" в этом отношении или только TIMTOWTDI?
Когда следует предпочесть регулярное выражение над встроенными строковыми функциями?
Ответ 1
Я думаю, что многие ответы, которые у вас уже есть, хороши. Я хочу обратиться к части этикета, потому что я думаю, что есть некоторые.
Подсчитано: если имеется надежный парсер, используйте его вместо регулярных выражений; 100% времени. Никогда не рекомендуйте ничего начинающему. Так и Ndash;
Этикет
- Не разделяйте или не сопоставляйте запятые для CSV, используйте Текст:: CSV/Текст:: CSV_XS.
- Не пишите регулярные выражения против HTML или XML, используйте XML:: LibXML, XML:: Twig, HTML:: TreeBuilder, HTML:: TokeParser:: Simple и т.д.
- Не писать регулярные выражения для вещей, которые тривиальны для split или unpack.
Dos
- Используйте substr, index и rindex, если это необходимо, но признайте, что они могут "отменить", поэтому их лучше использовать, когда бенчмаркинг показывает их выше регулярных выражений; регулярные выражения могут быть неожиданно быстрыми во многих случаях.
- Использовать регулярные выражения, когда нет хорошего парсера, и писать грамматику Parse:: RecDescent - слишком много работы, слишком много работы или будет слишком медленным.
- Использовать регулярные выражения для кода выброса, как однострочные, для хорошо известных/прогнозируемых данных, включая HTML/CSV, ранее запрещенные для использования регулярных выражений.
- Помните об альтернативах для более крупных проблем, таких как P:: RecD, Parse:: Yapp и Marpa.
- Соблюдайте свой собственный совет. Предполагается, что Perl будет забавным. Делайте все, что захотите; просто будьте готовы получить удар, если вы жалуетесь, когда не следуете советам, и он идет боком.: P
Ответ 2
Уровень сложности обычно определяет, использую ли я регулярное выражение или нет. Некоторые вопросы, которые я задаю при принятии решения о том, следует ли использовать регулярное выражение, следующие:
- Нет ли встроенной строковой функции, которая обрабатывает это относительно легко?
- Нужно ли собирать группы подстрок?
- Нужны ли мне сложные функции, такие как внешний вид или отрицательные наборы?
- Я собираюсь использовать наборы символов?
- Будет ли использование регулярного выражения сделать мой код более удобочитаемым?
Если я отвечу да на любой из них, я обычно использую регулярное выражение.
Ответ 3
Я не знаю ни одного "этикета" об этом.
Perl regex сильно оптимизирован (что одна из вещей, язык которых известен, хотя есть двигатели, которые быстрее), и, в конце концов, если ваше регулярное выражение настолько просто, что его можно заменить строковой функцией, Я не верю, что регулярное выражение будет менее значительным. Если проблема, которую вы пытаетесь решить, настолько чувствительна к времени, что вы можете изучить другие возможности оптимизации.
Другим важным аспектом является читаемость. И я думаю, что обработка всех строковых преобразований через регулярное выражение также добавляет к этому, установки смешивания и соответствия различным подходам.
Только мои два цента.
Ответ 4
Хотя я бы классифицировал это как упрямый для SO, я дам свою точку зрения.
Используйте regex, когда строка:
- "Too Dynamic" (строка может иметь много вариаций, что использование строковой библиотеки (ов) было бы громоздким.
- "Содержит шаблоны", если есть подлинный шаблон для строки (и может быть такой же простой, как 1 символ или группа символов), это где (я чувствую), что выражение regex превосходит.
- "Слишком сложный" Если вы обнаруживаете, что объявляете целый функциональный блок только для того, чтобы сделать то, что может сделать один шаблон, я вижу, что стоит просто использовать регулярное выражение. (Однако см. Также "Слишком сложный" ).
Использовать регулярное выражение не:
- "Быстрая". Рассмотрите накладные расходы, связанные с разворачиванием библиотеки регулярных выражений за захват информации непосредственно из строки.
- "Слишком сложный" Хороший код не всегда короткий. Если вы начнете создавать огромный шаблон, чтобы обойти несколько строк кода, это прекрасно, но имейте в виду, что он рискует удобочитаемости. Возвращаясь к этой части и пытаясь обернуть вокруг нее снова, возможно, не стоит просто использовать метод простой-jane.
Ответ 5
Я бы сказал, если вам нужно более одного или двух вызовов строковых функций для этого, используйте регулярное выражение.;)
Ответ 6
Perl - отличный язык для регулярного выражения. У него, честно говоря, один из величайших парсеров любого языка, поэтому вы видите так много ответов "использовать регулярное выражение". Однако я не уверен, что отвращение к регулярному выражению.
Моим ответом было бы: можете ли вы суммировать работу в одном шаблоне проще, чем использовать строковую функцию, или вам нужно использовать несколько строковых функций по сравнению с одним регулярным выражением? В любом случае я бы нацелился на регулярное выражение. В противном случае сделайте то, что вам удобно.
Ответ 7
Для вещей, которые не слишком сложны, когда регулярное выражение становится раздутым, влияет на читаемость кода и вызывает проблемы с производительностью. Вы можете сделать это с помощью серьезных шагов, используя встроенные функции и другие средства. У вас может не быть классного однорежимного регулярного выражения, но ваш код будет доступен для чтения и maintanable.
А также не слишком простые проблемы, потому что, опять же, регулярные выражения имеют большой вес, и обычно есть встроенные функции, которые обрабатывают простые сценарии.
Это будет зависеть от того, что вы собираетесь делать. Конечно, не используйте регулярное выражение для синтаксического анализа (особенно HTML и т.д.).