正则表达式中的regex{m,n}和(regex){m,n}有什么区别?

8

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

  1. 只包含ASCII字符,不包括大写字母。
  2. 特殊字符只包括句点(.),连字符(-)和下划线(_)。
  3. 只以字母和数字开头和结尾。
  4. 特殊字符不能连续出现。
  5. 长度限制(最小:2,最大:255)。

接下来,我的正则表达式是:

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

但是,如果仓库名称为e-e_1.1,就不行了。

当我把它改成:

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

没问题。

有人能解释吗?谢谢提前。


regex{m,n} 匹配 "rege" 后跟 mn 次 "x" 字符,(regex){m,n} 匹配 "regexregexregex..regex"(重复 mn 次)。 - Maroun
@MarounMaroun regex 指定一个正则表达式,而不是指定一个字符串 "regex"。 - xautjzd
1个回答

8
在正则表达式“([a-z0-9]+(?:[._-][a-z0-9]+)*){2,255}”中,限定符{2,255}应用于Group 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个字符(. 匹配除换行符以外的任何字符,但由于您稍后只允许匹配特定字符,因此它并不重要)直到字符串结尾。

非常感谢,我学到了很多。我认为我在正则表达式方面还有很长的路要走,谢谢你的回答! - xautjzd
这条路不必太长。阅读Lookahead Example: Simple Password Validation快捷文章 :) - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接