Как использовать регулярные выражения для ограничения общей длины входной строки - PullRequest
6 голосов
/ 23 ноября 2011

У меня есть это регулярное выражение и я хочу добавить правило, ограничивающее общую длину не более 15 символов.Я видел несколько предварительных примеров, но они не совсем понятны.Можете ли вы помочь мне изменить это выражение для поддержки нового правила.

^([A-Z]+( )*[A-Z]+)+$

Ответы [ 3 ]

11 голосов
/ 23 ноября 2011

На самом деле, все это можно значительно упростить:

^[A-Z][A-Z ]{0,13}[A-Z]$

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

Пример:

Попробуйте строку ABCDEFGHIJKLMNOPпротив вашего оригинального регулярного выражения.Движок регулярных выражений будет соответствовать этому мгновенно.Теперь попробуйте строку ABCDEFGHIJKLMNOPa.Потребуется, чтобы движок регулярных выражений прошел почти 230 000 шагов, чтобы понять, что он не может соответствовать строке.И каждый дополнительный символ удваивает количество шагов, необходимых для определения неудачного совпадения.

11 голосов
/ 23 ноября 2011

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

^(?!.{16,})(regex goes here)+$

Обратите внимание на отрицательный прогноз в начале (?!.{16,}), который проверяет, что строка не имеет 16 илибольше символов.

Однако, как указал @TimPietzcker, ваш Regex может быть значительно упрощен и переписан в такой форме, которая не склонна к возврату, поэтому вы должны использовать его решение.

5 голосов
/ 23 ноября 2011
^(?=.{15}$)([A-Z]+( )*[A-Z]+)+$

Посмотреть

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