Загадка регулярного выражения: почему домен верхнего уровня падает на 19-м символе?

В процессе обучения я написал регулярное выражение для проверки доменных имен:

$reg = "#^(([a-zA-Z0-9]+-?)*[a-zA-Z0-9]\.)*[a-zA-Z0-9]{2,}$#";
preg_match($reg, $domain, $res);

Оставим в стороне неточности самой проверки соответствия формату доменного имени - их всегда можно доработать. Меня заинтересовал другой, более специфичный вопрос.

Суть проблемы

Выражение работает безупречно, пока длина домена верхнего уровня (последней части после последней точки) не превышает 18 символов. Как только добавляется 19-й символ - результат становится false.

При этом все остальные сценарии не вызывают ошибок:

  • Наличие поддоменов (проверял до 20-30 штук).
  • Длина каждой части домена до 40-50 символов.
  • Отсутствие поддоменов.
  • Пустые имена - корректно вызывают ошибку, как и задумано.

С точки зрения логики регулярного выражения, эти случаи понятны и ожидаемы. Но ограничение в 18 символов для TLD выглядит аномалией.

Примеры, демонстрирующие проблему

Работающие варианты (возвращают true):

  • 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.1.rusreasreasreasreasssreasreasreasreasss.reasreasreasreasss
  • rusreasreasreasreasssreasreasreasreasss.reasreasreasreasss
  • reasreasreasreasss (18 символов)

Падающий вариант (возвращает false):

  • reasreasreasreassss (19 символов)

Вопрос: почему добавление всего одного символа, создающее 19-символьный домен верхнего уровня, ломает проверку?