我正在开发一个docker项目,需要编写一个正则表达式来检查存储库名称。 要求如下:
然后,我的正则表达式是:
([a-z0-9]+(?:[._-][a-z0-9]+)*){2,255}
但是,当存储库名称为e-e_1.1
当我将其更改为:
[a-z0-9]+(?:[._-][a-z0-9]+)*{2,255}
没关系。
有人可以解释吗?提前谢谢。
答案 0 :(得分:8)
在([a-z0-9]+(?:[._-][a-z0-9]+)*){2,255}
正则表达式中,限制量词{2,255}
应用于第1组([a-z0-9]+(?:[._-][a-z0-9]+)*
)内的整个模式。这意味着它可以重复2到255次。这并不意味着整个字符串长度限制为2到255个字符。
现在,您的[a-z0-9]+(?:[._-][a-z0-9]+)*{2,255}
正则表达式也可以匹配无限制字符,因为与[a-z0-9]+
匹配的字符串可以包含1个或更多个字符。 (?:[._-][a-z0-9]+)*
可以匹配零个或多个字符。限制量词{2,255}
在您需要的任何方式都不起作用。
要将输入字符串的长度限制为2到255个字符,您必须使用在开头处锚定的前瞻:
^(?=.{2,255}$)[a-z0-9]+(?:[._-][a-z0-9]+)*$
^^^^^^^^^^^^^
(?=.{2,255}$)
预测将仅在字符串的开头执行一次,只有在前瞻条件满足时才会找到匹配项:必须有2到255个字符(.
匹配除换行符之外的任何字符,但它并不重要,因为您只允许稍后匹配模式中的特定字符)直到字符串的结尾。