На самом деле, все это можно значительно упростить:
^[A-Z][A-Z ]{0,13}[A-Z]$
делает именно то, что вы хотите.Или, по крайней мере, то, что делает ваше текущее регулярное выражение (плюс ограничение длины).Это, в частности, позволяет избежать проблем с катастрофическим возвратом g, которые вы настраиваете для таких вложенных квантификаторов.
Пример:
Попробуйте строку ABCDEFGHIJKLMNOP
против вашего оригинального регулярного выражения.Движок регулярных выражений будет соответствовать этому мгновенно.Теперь попробуйте строку ABCDEFGHIJKLMNOPa
.Потребуется, чтобы движок регулярных выражений прошел почти 230 000 шагов, чтобы понять, что он не может соответствовать строке.И каждый дополнительный символ удваивает количество шагов, необходимых для определения неудачного совпадения.