Regex.Replace намного медленнее, чем условный оператор с использованием String.Contains - PullRequest
2 голосов
/ 15 сентября 2009

У меня есть список из 400 строк, которые заканчиваются на "_GONOGO" или "_ALLOC". Когда приложение запускается, мне нужно убрать "_GONOGO" или "_ALLOC" из каждой из этих строк.

Я попробовал это: 'string blah = Regex.Replace (string, "(_GONOGO | _ALLOC)", ""));'

но это НАМНОГО медленнее, чем простое условное выражение вроде этого:

if (string.Contains("_GONOGO"))
          // use Substring
else if (string.Contains("_ALLOC"))
          // use Substring w/different index

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

Ответы [ 5 ]

8 голосов
/ 15 сентября 2009

Хотя это не RegEx, вы могли бы сделать

string blah = string.Replace("_GONOGO", "").Replace("_ALLOC", "");

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

4 голосов
/ 15 сентября 2009

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

Regex exp = new Regex(
    @"(_GONOGO|_ALLOC)",
    RegexOptions.Compiled);

exp.Replace(string, String.Empty);
3 голосов
/ 15 сентября 2009

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

Если вы используете это регулярное выражение в нескольких местах, вы можете использовать флаг RegexOptions.Compiled, чтобы уменьшить накладные расходы на матч, как описывает Дэвид в своем ответе. У других экспертов по регулярным выражениям могут быть советы по улучшению выражения. Вы можете рассмотреть возможность использования String.Replace; это быстро и читабельно.

1 голос
/ 15 сентября 2009

Когда у вас так много информации о проблемной области, вы можете упростить задачу:

const int AllocLength = 6;
const int GonogoLength = 7;
string s = ...;
if (s[s.Length - 1] == 'C')
    s = s.Substring(0, s.Length - AllocLength);
else
    s = s.Substring(0, s.Length - GonogoLength);

Это теоретически быстрее, чем решение Авраама , но не так гибко. Если у строк есть какие-либо шансы на изменение, то эта будет страдать от проблем с обслуживанием, которых у него нет.

1 голос
/ 15 сентября 2009

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

string result = source.Substring(0, source.LastIndexOf('_'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...