正则表达式长度问题

时间:2018-06-14 09:49:40

标签: regex regex-lookarounds

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

  1. 允许最多255个字符的DNS名称(仅限连字符,句号和字母数字字符)。
  2. 连字符只能出现在字母之间
  3. 应以字母开头,以字母结尾。它至少有3个字符(必填字母和句点,连字符是可选的。)
  4. 一段时间之前标签的长度应为63
  5. 可能的案例:

    1. A.B.C
    2. A-A·B
    3. 不应传递的案件

      1. 一个-.B
      2. qwertqwertqwertqwertqwertqwertqwertqwertqwertqwertqwertqwertqwerhhg.v
      3. AAAA
      4. AAA-A
      5. 我制作的内容如下:

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

        但这不接受a.b.c

2 个答案:

答案 0 :(得分:2)

您可以使用

^(?=.{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])?$

请参阅regex demo here

模式详情

  • ^ - 字符串开头
  • (?=.{1,255}$) - 整个字符串应该有1到255个字符
  • (?=[^.]{1,63}(?![^.])) - 除.以外的字符.之外,字符串除<{1}}之外必须有1到63个字符
  • [a-zA-Z0-9]+ - 一个或多个字母数字字符
  • (?: - 非捕获组的开始:
    • - - 连字符
    • [a-zA-Z0-9]+ - 1个字母数字字符
  • )* - 零次或多次重复
  • (?: - 非捕获组的开始......
    • [.] - 一个点
    • (?=[^.]{1,63}(?![^.])) - 除.以外的字符.之外,字符串除<{1}}之外必须有1到63个字符
    • [a-zA-Z0-9]+ - 1个字母数字字符
    • (?:-[a-zA-Z0-9]+)* - 重复-次后加1个字母数字字符
  • )+ -... 1次或多次
  • (?: - 非捕获组的开始......
    • [.] - 一个点
    • [a-zA-Z0-9-]* - 1 +字母数字或-字符
    • [a-zA-Z0-9] - 一个字母数字字符(最后没有连字符)
  • )? -... 1或0次(可选)
  • $ - 字符串结束。

答案 1 :(得分:2)

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

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

详细说明:

  • ^ - 字符串的开头。
  • (?=[A-Z]) - 正向前瞻:整个字符串必须以字母开头。
  • ( - 捕获组 - 域名。
    • (?: - 由于以下量词而需要启动非捕获组。
    • [A-Z\d] - 第一种选择:字母或数字。
    • | - 或。
    • (?<=[A-Z])-(?=[A-Z]) - 第二种选择:连字符,前面有一个字母 然后是一封信。
    • ) - 非捕获组的结束。
    • {1,63} - 此组(替代方案)必须最多出现63次。
  • ) - 捕获组结束。
  • (?<=[A-Z]) - 正面lookbehid:刚刚匹配的捕获组(域名) 必须以一封信结尾。
  • (?: - 由于以下量词,也需要非捕获组。
    • \.[A-Z\d]+ - 一个点和一系列字母或数字。
  • ) - 非捕获组的结束。
  • {1,2} - 此组必须出现1次或2次。
  • $ - 字符串的结尾。

如果你检查,你肯定应该使用i(不区分大小写)选项 许多字符串,每个字符串都在一个单独的行中,也是m(多行)选项。

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