Когда использовать Regex против встроенных строковых методов? - PullRequest
6 голосов
/ 30 июня 2009

Я заметил много небольших споров о том, когда использовать регулярное выражение и когда использовать встроенную строковую функцию, такую ​​как String.Replace () (.NET).

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

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

Ответы [ 5 ]

9 голосов
/ 30 июня 2009

Я думаю, что использовать Regex в качестве универсального решения неправильно, когда возможен поиск / замена на основе строк.

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

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

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

2 голосов
/ 30 июня 2009

Мне просто нравятся регулярные выражения, но если есть простая функция типа xxx-> replace ("foo", "bar"), кажется глупым использовать такой мощный инструмент, как regex, когда это делает простая отвертка.

Если производительность является проблемой, то регулярные выражения могут быть очень трудоемкими для простых замен. (Regex обычно работает более эффективно при сложном поиске / преобразовании, чем серия «более простых» вызовов).

Кроме того, я постоянно замечаю «незначительные» различия в реализации - например, Pythons подразумевает «^ ... $» во встроенной функции match (). В то время я был в дороге без доступа к интернету и в итоге купил еще одну копию книги Лутца, чтобы узнать, что происходит!

2 голосов
/ 30 июня 2009

Regex.Replace () намного дороже, чем метод String.Replace (). Используйте String.Replace (), когда это возможно, и Regex, когда это необходимо.

Посмотрите на этот тест , чтобы увидеть разницу во времени.

1 голос
/ 30 июня 2009

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

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

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

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

0 голосов
/ 30 июня 2009

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

Но, как и в случае с чем-либо субъективным, если вас беспокоит время исполнения, используйте разные методы.

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

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