2012-01-12 3 views
0
re = new Regex ((.*?)someliteraltext(.*?moreliteral), RegexOptions.Singleline); 
re.Match(c); 

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

Я запускаю это на куске текста, который составляет около 100 тыс. Символов, и он работает в течение нескольких минут.

Не может быть быстрее?

+0

Вы начинаете '(. *?)'? – Wrikken

+0

Как переписывать это в 'IndexOf'? – CodesInChaos

+1

Или, может быть, вы должны прикрепить его '^' – CodesInChaos

ответ

3

Я согласен с комментариями, что вещь, которая, скорее всего, замедляет ее, - это запуск (. *?). Если у вас есть 1000 символов перед первым «someliteraltext», это уже 1001 совпадение этой части регулярного выражения. Предложение @CodeInChaos о префиксах с ^ (начало строки) - это быстрый способ ограничить эти соответствия. Если это неприемлемо, вам нужно будет объяснить больше того, что вы пытаетесь сделать со спичками, чтобы получить лучший ответ.

+0

^Хорошо работает, я должен был подумать о том, чтобы попробовать это. –

2

Это медленный, потому что для этого требуется много возврата. В статье здесь:

http://www.regular-expressions.info/engine.html

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

Как @Wrikken предложил, удалив исходный «(. *?)». Эта группа захвата будет захватывать все с начала строки до «someliteraltext».

В качестве альтернативы, используйте «IndexOf», чтобы найти «someliteraltext», а затем «moreliteral» после него. Это должно быть быстрее.

Смежные вопросы