Как ограничить длину регулярного выражения, основываясь на его самой внешней группе захвата, а не на каком-либо специальном наборе символов - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь реализовать регулярное выражение для имени хоста с диапазоном длины 1-5

Но мое регулярное выражение принимает любую строку бесконечной длины

Это конкретное регулярное выражение не может быть выполнено путем количественной оценки отдельных групп символов, поскольку мое требование относится к общему размеру имени хоста

^(([a-zA-Z0-9][a-zA-Z0-9-]*([\\.]{1}[a-zA-Z0-9-]+)*)*[a-zA-Z0-9]){0,4}$

Регулярное выражение должно иметь возможность отбрасывать любую группу символов длиной более 5

.

1 Ответ

0 голосов
/ 26 июня 2019

проблема

В вашем регулярном выражении подчеркнутая часть в основном (жадная) соответствует как можно большему количеству "меток" с периодами между ними.

^(([a-zA-Z0-9][a-zA-Z0-9-]*([\\.]{1}[a-zA-Z0-9-]+)*)*[a-zA-Z0-9]){0,4}$
 ----------------------------------------------------

Решение

^(?!-)[a-zA-Z0-9-]{1,63}(?<!-)(?:\.(?!-)[a-zA-Z0-9-]{1,63}(?<!-)){0,4}$

Использование отрицательных взглядов и взглядов для проверки отсутствия '-' в начале и в конце.

Я не совсем уверен, если это то, что вы хотели, но объяснить это регулярное выражение соответствует:

  1. по крайней мере, одна этикетка максимум с 5 этикетками
  2. каждая метка состоит как минимум из одного символа (буквенно-цифровой или '-') и не более 63 символов
  3. метка не имеет '-' как первый или последний символ
  4. каждая метка отделяется точкой

Это конкретное регулярное выражение не может быть выполнено путем количественной оценки отдельных групп символов, так как мое требование касается общего размера имени хоста

Если вы хотите ограничить размер совпадения, вы можете добавить что-то вроде

(?=^.{1,20}$)

к началу регулярного выражения. Это гарантирует, что строка содержит не более 20 символов.

...