Regex. IsMatch по сравнению со строкой. Содержит

Есть ли любое различие в скорости/использовании памяти для этих двух эквивалентных выражений:

Regex.IsMatch(Message, "1000")

По сравнению с

Message.Contains("1000")

Какие-либо ситуации, где каждый лучше, чем другой?

Контекст этого вопроса следующие: Я вносил некоторые изменения в унаследованный код, который содержал выражение Regex, чтобы найти, содержится ли строка в другой строке. Быть унаследованным кодом, который я не вносил изменениями в это и в коде, рассматривает кого-то, предложил тот Regex. IsMatch должен быть заменен строкой. Содержит. Таким образом, я задавался вопросом, стоило ли изменение внести.

42
задан Pradeep 4 June 2010 в 17:35
поделиться

3 ответа

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

С регулярным выражением связаны определенные накладные расходы (синтаксический анализ выражения, компиляция, выполнение и т. Д.), Которых просто нет в простом методе, таком как String.Contains , поэтому String.Contains превзойдет регулярное выражение в таких примерах, как ваш.

43
ответ дан 26 November 2019 в 23:34
поделиться

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

0
ответ дан 26 November 2019 в 23:34
поделиться

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

Реализация String.Contains() в конечном итоге вызовет родной метод IndexOfString(), реализация которого известна только Microsoft. Однако хорошим алгоритмом для реализации этого метода является использование алгоритма Knuth-Morris-Pratt. Сложность этого алгоритма составляет O(m + n), где m - длина искомой строки, а n - длина искомой строки, что делает этот алгоритм очень эффективным.

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

Если вас действительно волнует скорость поиска, то у Кристиана Шарраса и Тьерри Лекрока есть много материала о алгоритмах точного сопоставления строк в Université de Rouen.

7
ответ дан 26 November 2019 в 23:34
поделиться
Другие вопросы по тегам:

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