我正在开发一个docker项目,需要编写一个正则表达式来检查存储库名称.要求如下:
那么,我的正则表达式是:
([a-z0-9]+(?:[._-][a-z0-9]+)*){2,255}
Run Code Online (Sandbox Code Playgroud)
但是,当存储库名称为时,它可能不行 e-e_1.1
当我将其更改为:
[a-z0-9]+(?:[._-][a-z0-9]+)*{2,255}
Run Code Online (Sandbox Code Playgroud)
没关系.
有人可以解释一下吗?先感谢您.
在([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]+)*$
^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
该(?=.{2,255}$)
先行将只有一次在字符串的开始执行,如果先行里面的条件被满足匹配才会被发现:必须有2至255个字符(.
匹配除换行符以外的任何字符,但它并不重要因为你只允许匹配模式中的特定字符,直到字符串的结尾.