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

Являются ли регулярные выражения стоящими на стычке?

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

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

4b9b3361

Ответ 1

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

Тем не менее, у них определенно есть свое применение. Попробуйте удалить все элементы html из коробки без него!

Ответ 2

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

Ответ 3

Профессиональные разработчики должны быть знакомы с основным синтаксисом

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

Это нравится: "Хорошо. У нас есть выражения лямбда, но кто заботится, я все еще могу сделать это по-старому".

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

Ответ 4

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

Размер кода является единственным наиболее важным фактором снижения ремонтопригодности.

И хотя Regexps можно очень сильно расшифровать, так же как и методы обработки строк в 50 строк, а последние чаще содержат ошибки в редких случаях.

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

Ответ 5

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

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

a = re.compile(r"""\d +  # the integral part
               \.    # the decimal point
               \d *  # some fractional digits""", re.X)

Еще одна возможность - создать регулярное выражение из строк, по строке и прокомментировать каждую строку, например:

a = re.compile("\d+"  # the integral part
               "\."    # the decimal point
               "\d *"  # fraction  digits
               )

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

Ответ 6

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

Привет

Ответ 7

С большой силой приходит большая ответственность!

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

Ответ 8

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

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

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

  • Время. Вам не нужно писать свой собственный код, чтобы делать то, что встроено.
  • ремонтопригодность. Вы должны поддерживать только пару строк, а не 30 или 300.
  • Производительность. Код оптимизирован
  • Надежность. Если ваш оператор regex верен, он должен работать правильно.
  • Гибкость. Regex дает вам много энергии, которая очень полезна при правильном использовании

Ответ 9

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

Ответ 10

Самое сложное, что я вижу, - это когда люди пытаются анализировать нерегулярные языки с регулярными выражениями (да, это включает в себя все программирование и многие языки разметки, да, также HTML). Я иногда хочу, чтобы все кодеры должны были продемонстрировать, что они поняли, по крайней мере, разницу между контекстно-свободными и регулярными языками, прежде чем им разрешено использовать регулярные выражения. В качестве альтернативы, они могут получить свою лицензию regex, отмененную, когда они пойманы, пытаясь разобрать с ними нерегулярные языки. Да, я шучу, но только наполовину.

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

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

Ответ 11

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

Ответ 12

В .NET regex'es вы можете иметь комментарии и разбивать их на несколько строк, использовать отступы и т.д. (я не знаю других диалектов...)

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

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

Ответ 13

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

Ответ 14

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

Ответ 15

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

Regexes можно рассматривать как "писать только", но я думаю, что это иногда полезно. При написании относительно простого регулярного выражения с нуля это довольно легко понять.

Ответ 16

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

Ответ 17

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

Кроме того, представьте, если вы проверяли номера телефонов, и вы решили использовать код вместо reg ex. Таким образом, это позволяет сказать 20 строк. Со временем ваша компания решит расширить свои возможности в других регионах, где теперь проверка подлинности телефона больше не является полной истиной. Поэтому вы должны настроить его, чтобы он соответствовал другим требованиям. Возможно, что код будет сложнее поддерживать, потому что вам нужно настроить более 20 строк кода, а не просто удалить старый reg ex и заменить его новым.

Однако, я думаю, что код может использоваться в некоторых случаях вместе с регулярным выражением. Например, допустим, что вы хотите проверить номера телефонов в США, в каждом случае он имеет 10 цифр, но есть буквально тонна способов его написания. Например (xxx) xxx-xxxx или xxx-xxx-xxxx, или xxx xxx xxxx и т.д. И т.д. И т.д. Поэтому, если вы напишете reg ex, вам придется учитывать каждый из этих случаев. Однако, если вы просто разделите все нечисло и пробелы с заменой регулярных выражений, затем перейдите на второй проход и проверьте, имеет ли он 10 цифр, вам будет легче, чем учет всех возможных способов записи номера телефона.

Ответ 18

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

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

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

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

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

Ответ 19

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

Редко, что мне нужно очень много манипуляции с строкой, кроме конкатенации.

Кстати, приложения, как правило, CRM.

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

Ответ 20

Прочтите раздел в разделе "Использование контрольных показателей" в JavaWorld.

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

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

Ответ 21

Уверен, что весь код необходимо оптимизировать, где это возможно!

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

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

Ответ 22

Я просто столкнулся с этой проблемой. Я построил регулярное выражение, чтобы вытащить группы данных из длинной строки чисел и некоторых других шумов. Регулярное выражение было довольно длинным, хотя и кратким, и оно стало еще больше, когда я попытался добавить его в приложение С#, которое я писал. В общей сложности reg ex был 3 строки кода.

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

Что лучше? Мое эго говорит о регулярных выражениях. Любой новый прокат сказал бы, что он лишит вас.

Ответ 23

VB.net лучше, Нет, С#, No F # является лучшим. На мой взгляд, это скорее вопрос того, что будет поддерживать люди. Это более проблематичный вопрос, чем что-то абсолютно ответственное.

Лично я бы выбрал регулярное выражение всякий раз, когда существует сложная проверка строки (номера телефонов, электронные письма, ss #, ip-адреса), где есть хорошо известное регулярное выражение. Получите это от regex.org, дайте указание с комментарием и/или получите разрешение авторов в зависимости от того, что подходит, и сделайте с ним.

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

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

Ответ 24

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

Является ли Regex достойной вам хлопот? Не знаю. Зависит от того, насколько серьезно вы принимаете то, что делаете.