Вы работаете с сумасшедшим возвратом, распространенной функцией в регулярных выражениях, которая включает в себя что-то вроде формы ([символы] +) + - она отлично работает для всех типов совпадающих шаблонов, но затем вы найдете строку, подобную этой , который заставляет его взорваться, повторяя всю строку. Вот набросок того, что происходит.
Для начала ваш шаблон разбивает строку на группы. Я использую |
для запуска экземпляров вашей группы, которые вы повторяете {1,100}
. >
- это конец группы, а ?
- это «курсор» анализатора регулярных выражений.
|----------->|---------->|-------?
Optometrists Association Australia, Queensland/NT Division
В? Ваш шаблон не может больше соответствовать символам или пробелам, поэтому он пытается соответствовать $. Поскольку курсор еще не достиг конца строки, он завершается ошибкой, и анализатор регулярных выражений возвращается:
|----------->|---------->|------?
Optometrists Association Australia, Queensland/NT Division
Еще раз, он не может найти ни одного пробела, поэтому он завершает группу и пытается запустить еще один (поскольку может быть до 100, а мы пока использовали только 3).
|----------->|---------->|------|-?
Optometrists Association Australia, Queensland/NT Division
Синтаксический анализатор снова достиг проблемного ,
, и он убивает это дерево выполнения, заставляя его еще раз вернуться к i
в Australia
. И, как и в прошлый раз, он пытается создать группу:
|----------->|---------->|-----|--?
Optometrists Association Australia, Queensland/NT Division
... в любом случае, вы поняли идею. Этот цикл сбоя, возврата и среза снова фактически заморозит ваш анализатор Regex, пока он не исчерпает каждую перестановку и не вернет false. Ключом к распознаванию и исправлению этого является то, что никогда не повторяет повторяющуюся группу без какой-либо формы разделителя в начале и / или конце. Я бы предложил использовать привязку границы слова \b
, поскольку [ ]+
потребует, чтобы ваши строки заканчивались пробелами:
/^(\b[\w'#@\-\&\(\)\/.]+\b[ ]*){1,100}$/
В качестве дополнительного примечания трудно сказать, что делает ваше регулярное выражение без дополнительного контекста, но кажется, что вы также можете просто вызвать value.split(' ')
, чтобы разбить строку на пробельные символы и выполнить более простое регулярное выражение для всех этих подстроки. Это исключило бы необходимость повторения двойного регулярного выражения.