Должны ли мы использовать регулярные выражения в Java? - PullRequest
1 голос
/ 17 марта 2011

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

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

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

Ответы [ 9 ]

4 голосов
/ 17 марта 2011

Как и все: используйте осторожно и ПОЦЕЛУЙ

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

4 голосов
/ 17 марта 2011

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

  • Библиотеки REGEX обычно имеют оптимизированную реализацию, которая в большинстве случаев будет лучше, чем цепочка "IF" с ручным кодированием для некоторых выражений.* REGEX обычно легче следовать, если правильно написано, чем цепочки IF.Специально для более сложных выражений.

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

3 голосов
/ 17 марта 2011

Если вы обнаружите, что регулярное выражение станет слишком сложным и неосновным, используйте вместо этого код. Регулярные выражения могут быть очень сложными даже для вещей, которые на первый взгляд кажутся очень простыми. Например, проверка дат в формате мм / дд / гг [гг] так же «проста», как:

^(((((((0?[13578])|(1[02]))[\.\-/]?((0?[1-9])|([12]\d)|(3[01])))|(((0?[469])|(11))[\.\-/]?((0?[1-9])|([12]\d)|(30)))|((0?2)[\.\-/]?((0?[1-9])|(1\d)|(2[0-8]))))[\.\-/]?(((19)|(20))?([\d][\d]))))|((0?2)[\.\-/]?(29)[\.\-/]?(((19)|(20))?(([02468][048])|([13579][26])))))$

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

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

2 голосов
/ 17 марта 2011

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

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

1 голос
/ 17 марта 2011

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

Реализация Java RE все еще имеет некоторые странности, в результате чего некоторые довольно простые выражения (например, '((?:[^'\\]|\\.)*)') вызывают переполнение стека при сопоставлении более длинных строк. Поэтому убедитесь, что вы тестируете с реальными данными (и более экстремальными примерами тоже) - или используете движок регулярных выражений с другой реализацией (есть несколько, также как библиотеки Java).

1 голос
/ 17 марта 2011

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

final String REGEX_SOMETHING = "something";
final String REGEX_WHATEVER = "whatever";
..
String REGEX_COMPLETE = REGEX_SOMETHING + REGEX_WHATEVER + ...
1 голос
/ 17 марта 2011

Регулярные выражения - это инструмент (как и многие другие).Вы должны использовать его, когда лучше всего выполнить работу с этим инструментом.Чтобы узнать, какой инструмент использовать, он помогает задать вопрос типа «Когда я могу использовать регулярные выражения?».И, конечно, вам будет легче выбирать, какой инструмент использовать, когда у вас в наборе инструментов много разных инструментов, и вы хорошо их знаете.

1 голос
/ 17 марта 2011

Как всегда, вы должны использовать лучший инструмент для работы.Я бы определил «лучший инструмент» наиболее простым, понятным и эффективным методом, который удовлетворяет требованиям.

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

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

0 голосов
/ 17 марта 2011

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

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

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

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