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

2

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

Note: Regex, кажется, очень эмоциональный субъект, поэтому я с осторожностью задаю такой вопрос.This question is not inviting personal/profession opinions on regexтолько конкретные ситуации, когда решение, включая его использование, не так хорошо, как собственные команды языка (включая те, которые имеют базовый код, использующий регулярное выражение) и почему.

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

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

Ваш Ответ

8   ответов
4

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

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

Не примеры:

Трещин простой поиск и замена длинный текст Цикл существующие нативные функции (например, в PHP,strrchr, ucwords ...)
6

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

Дай немного текста:

value1, value2, value3

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

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

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

var match = Regex.Match(myString, "^([^,]*),([^,]*),([^,]*)$");
var value1 = match.Group[1];
...
+ 1. Кроме того, записи фиксированной длины поля John Pirie
Следует отметить, что функции "split" часто разделяются на регулярные выражения. Svante
2

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

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

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

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

1

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

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

1

кода.

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

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

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

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

@ V

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

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

1

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

0

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

0

Да. Пример

char* basename (const char* path)
{
  char* p = strrchr(path, '/');
  return (p != NULL) ? (p+1) : path;
}

Похожие вопросы