【问题标题】:Regex Length issue正则表达式长度问题
【发布时间】:2018-06-14 09:49:39
【问题描述】:

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

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

可能的情况:

  1. a.b.c
  2. a-a.b

不应通过的案例

  1. a-.b
  2. qwertqwertqwertqwertqwertqwertqwertqwertqwertqwertqwertqwertqwerhhg.v
  3. 啊啊啊
  4. aaa-a

我构建的东西是这样的:

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

但这不接受a.b.c

【问题讨论】:

标签: regex regex-lookarounds


【解决方案1】:

你可以使用

^(?=.{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 到 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 次(可选)
  • $ - 字符串结束。

【讨论】:

    【解决方案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] - 第一种选择:字母或数字。
      • | - 或者。
      • (?&lt;=[A-Z])-(?=[A-Z]) - 第二种选择:连字符,前面有一个字母 然后是一封信。
      • ) - 非捕获组结束。
      • {1,63} - 该组(任一种选择)必须出现最多 63 次。
    • ) - 捕获组结束。
    • (?&lt;=[A-Z]) - 正面的lookbehid:捕获组刚刚匹配(域名) 必须以字母结尾。
    • (?: - 一个非捕获组,由于以下量词,也需要该组。
      • \.[A-Z\d]+ - 一个点和一系列字母或数字。
    • ) - 非捕获组结束。
    • {1,2} - 该组必须出现 1 或 2 次。
    • $ - 字符串结束。

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

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

    【讨论】:

      猜你喜欢
      • 2013-12-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      相关资源
      最近更新 更多