регулярное выражение очень медленно при сбое - PullRequest
3 голосов
/ 09 июля 2010

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

Регулярное выражение выглядит следующим образом:

/^(([\w\-]+)( )?){0,}$/

При попытке проверки с помощью строки

"'this-is_SAMPLE-scope-123,this-is_SAMPLE-scope-456'"

это занимает 2 секунды.

Испытания проводились в рубинах 1.9.2-rc1 и 1.8.7. Но это, вероятно, общая проблема.

Есть идеи?

1 Ответ

8 голосов
/ 09 июля 2010

Ваш паттерн вызывает катастрофический откат .Катастрофическая часть может быть сведена к следующему:

(.+)*

+ и * взаимодействуют катастрофическим образом в некоторых движках.

Неясно, что вы пытаетесь сопоставитьТочно, но это может быть что-то вроде этого:

^[\w\-]+( [\w\-]+)*$

Это соответствует ( как видно на rubular.com ):

hello world
99 bottles of beer on the wall
this_works_too

и отклоняет:

not like this, not like this
hey what the &#@!
too many    spaces

Другим вариантом может быть использование притяжательных квантификаторов и / или атомарных группировок в частях исходного шаблона.

Ссылки


Дополнительные советы

Повтор {0,} обычно записывается просто как *,Вы также можете использовать группы без захвата для повышения производительности, например, (?:pattern).

Ссылки

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

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