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

时间:2016-02-29 08:42:31

标签: java regex

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

  1. 仅包含ASCII字符,排除upcase。
  2. 除了点(。),连字符( - )和下划线(_)之外,不包括特殊字符。
  3. 仅以字母和数字开头,并以此结尾。
  4. 特殊字符不能连续出现。
  5. 长度限制(最小值:2,最大值:255)
  6. 然后,我的正则表达式是:

    ([a-z0-9]+(?:[._-][a-z0-9]+)*){2,255}
    

    但是,当存储库名称为e-e_1.1

    时,它可能没问题

    当我将其更改为:

    [a-z0-9]+(?:[._-][a-z0-9]+)*{2,255}
    

    没关系。

    有人可以解释吗?提前谢谢。

1 个答案:

答案 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个字符(.匹配除换行符之外的任何字符,但它并不重要,因为您只允许稍后匹配模式中的特定字符)直到字符串的结尾。