正则表达式长度问题



我正在尝试构建一个正则表达式,它接受具有以下条件的域名:

  1. 允许最多 255 个字符的 DNS 名称(仅允许使用连字符、句点和字母数字字符(。
  2. 连字符只能出现在字母之间
  3. 应以字母
  4. 开头,以字母结尾。它至少包含 3 个字符(字母和句点为必填项,连字符为可选项。
  5. 句点前标签的长度应为 63

可能的情况:

  1. A.B.C
  2. A-A.B

不应通过的案例

  1. a-.b
  2. qwertqwertqwertqwertqwerhhg.v
  3. AAAA
  4. AAA-A

我构建的内容如下所示:

^(([a-zA-z0-9][A-Z0-9a-z-]{1,61}[a-zA-Z0-9][.])+[a-zA-Z0-9]+)$

但这不接受 a.b.c

您可以使用

^(?=.{1,255}$)(?=[^.]{1,63}(?![^.]))[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*(?:[.](?=[^.]{1,63}(?![^.]))[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*)+(?:[.][a-zA-Z0-9-]*[a-zA-Z0-9])?$

在此处查看正则表达式演示。

图案详细信息

  • ^- 字符串的开头
  • (?=.{1,255}$)- 整个字符串应包含 1 到 255 个字符
  • (?=[^.]{1,63}(?![^.]))- 在.或字符串末尾以外的字符之前,必须有 1 到 63
  • 个字符,而不是.
  • [a-zA-Z0-9]+- 1 个或多个字母数字字符
  • (?:- 非捕获组的开始:
    • -- 连字符
    • [a-zA-Z0-9]+- 1+ 字母数字字符
  • )*- 零次或多次重复
  • (?:- 非捕获组的开始...
    • [.]- 一个点
    • (?=[^.]{1,63}(?![^.]))- 在字符串.或字符串末尾的字符之前,必须有 1 到 63
    • 个字符,而不是.
    • [a-zA-Z0-9]+- 1+ 字母数字字符
    • (?:-[a-zA-Z0-9]+)*- 0 次或多次重复-后跟 1+ 字母数字字符
  • )+-...1 次或更多次
  • (?:- 非捕获组的开始...
    • [.]- 一个点
    • [a-zA-Z0-9-]*- 1+ 字母数字或-个字符
    • [a-zA-Z0-9]- 字母数字字符(末尾没有连字符(
  • )?-...1 或 0 次(可选(
  • $- 字符串的结尾。

您可以使用以下正则表达式:

/^(?=[A-Z])((?:[A-Zd]|(?<=[A-Z])-(?=[A-Z])){1,63})(?<=[A-Z])(?:.[A-Zd]+){1,2}$/im

详:

  • ^- 字符串的开头。
  • (?=[A-Z])- 积极的展望:整个字符串必须以字母开头。
  • (- 捕获组 - 域名。
    • (?:- 非捕获组的开始,由于以下量词而需要。
    • [A-Zd]- 第一种选择:字母或数字。
    • |- 或。
    • (?<=[A-Z])-(?=[A-Z])- 第二种选择:连字符,前面有一个字母 然后写了一封信。
    • )- 非捕获组的结束。
    • {1,63}- 此组(任一备选方案(必须最多出现 63 次。
  • )- 捕获组结束。
  • (?<=[A-Z])- 正面外观:捕获组刚刚匹配(域名( 必须以字母结尾。
  • (?:- 非捕获组,由于以下量词也需要。
    • .[A-Zd]+- 一个点和一个字母或数字序列。
  • )- 非捕获组的结束。
  • {1,2}- 此组必须出现 1 或 2 次。
  • $- 字符串的结尾。

您绝对应该使用i(不区分大小写(选项,如果您检查 许多字符串,每个字符串在单独的行中,也m(多行(选项。

我没有包括整个长度的任何测试,但你也没有包括它。 我认为,这里的主要任务是展示如何匹配您的正则表达式失败的情况。

最新更新