正则表达式{m,n}和(正则表达式){m,n}之间有什么区别?

xau*_*jzd 8 java regex

我正在开发一个docker项目,需要编写一个正则表达式来检查存储库名称.要求如下:

  1. 仅包含ASCII字符,排除upcase.
  2. 除了点(.),连字符( - )和下划线(_)之外,特殊字符除外.
  3. 只从字母和数字开始,并以它结束.
  4. 特殊字符不能连续出现.
  5. 长度限制(最小值:2,最大值:255)

那么,我的正则表达式是:

([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)

没关系.

有人可以解释一下吗?先感谢您.

Wik*_*żew 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]+)*$
 ^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

(?=.{2,255}$)先行将只有一次在字符串的开始执行,如果先行里面的条件被满足匹配才会被发现:必须有2至255个字符(.匹配除换行符以外的任何字符,但它并不重要因为你只允许匹配模式中的特定字符,直到字符串的结尾.