gpt4 book ai didi

java - regex{m,n} 和 (regex){m,n} 有什么区别?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:46:24 26 4
gpt4 key购买 nike

我正在开发一个 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}

没关系。

有没有人可以解释一下?提前谢谢你。

最佳答案

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

关于java - regex{m,n} 和 (regex){m,n} 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35695104/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com