Существуют ли конкретные случаи, когда манипулирование собственным текстом более желательно, чем регулярное выражение? - PullRequest
2 голосов
/ 24 июня 2009

Существуют ли конкретные случаи, когда манипулирование собственным текстом более желательно, чем регулярное выражение? В частности .net?

Примечание: Regex, кажется, очень эмоциональный субъект, поэтому я с осторожностью задаю такой вопрос. Этот вопрос не приглашает личных / профессиональных мнений о регулярном выражении , только о конкретных ситуациях, когда решение, включая его использование, не так хорошо, как родные команды языка (включая те, которые имеют базовый код, использующий регулярное выражение) и почему. *

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

Извиняюсь, если это дубликат, я искал SO для аналогичного вопроса.

Ответы [ 8 ]

6 голосов
/ 24 июня 2009

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

С учетом некоторого текста:

value1, value2, value3

Вы можете легко разобрать строку:

var values = myString.Split(',');

Я уверен, что есть лучший способ, но с регулярными выражениями вы должны сделать что-то вроде:

var match = Regex.Match(myString, "^([^,]*),([^,]*),([^,]*)$");
var value1 = match.Group[1];
...
4 голосов
/ 24 июня 2009

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

Личное эмпирическое правило: если сложно или сравнительно долго делать это «вручную» и прирост производительности незначителен, не делайте этого. Остальное до.

Не примеры:

  • 1010 * Раскол *
  • простой поиск и замена
  • длинный текст
  • цикл * * 1016
  • существующих встроенных функций (например, в PHP, strrchr, ucwords ...)
2 голосов
/ 24 июня 2009

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

Я предпочитаю манипулирование собственным текстом над регулярным выражением в любое время, когда другим людям будет легче следить за манипулированием собственным текстом. Что довольно часто, так как многие люди вокруг меня не очень хорошо знакомы с регулярным выражением. Если вы не работаете с чем-то, что связано с синтаксическим анализом (через регулярные выражения), они не должны быть такими!

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

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

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

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

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

Существуют некоторые издержки при настройке объекта и анализе выражения. Для упрощения работы со строками вы можете повысить производительность с помощью простых строковых методов.

Пример:
Получение имени файла из пути к файлу (да, я знаю, что для этого следует использовать класс Path, это всего лишь пример ...)

string name = Regex.Match(path, @"([^\\]+)$").Groups[0].Value;

против

string name = path.Substring(path.LastIndexOf('\\') + 1);

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

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

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

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

RegEx очень гибкие и мощные, потому что они во многом похожи на оператор eval (). При этом, в зависимости от реализации, они могут быть немного медленными. Как правило, это не проблема, однако, если их можно избежать в особенно дорогостоящем цикле, это может повысить производительность.

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

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

Да. Пример:

char* basename (const char* path)
{
  char* p = strrchr(path, '/');
  return (p != NULL) ? (p+1) : path;
}
0 голосов
/ 24 июня 2009

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

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