子域的正则表达式

Regex for sub domain

我有一个可以生成一级子域的系统,我想要一个正则表达式来在创建子域之前验证它。

到目前为止我想出了:

^[a-zA-Z0-9]+[a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]*$

来自我的测试用例

我仍然不确定我的模式是否正确。如果有人能给我一个更好的正则表达式或指出我忘记的任何规则,请告诉我。

你的模式有几个问题:

  1. 在第一个字符后使用 + 量词 class 允许无限长的字符串({0,61} 量词变得多余)。

  2. 在最后一个字符 class 之后使用 * 量词允许它匹配零个字符(这使得模式在末尾接受连字符)并且也具有相同的问题如上

您可以使用:

^(?=[a-zA-Z0-9].{0,62}$)[a-zA-Z0-9\-]*[a-zA-Z0-9]$

Demo.

细分:

  • ^ - 字符串的开头。
  • (?= - 积极的开始 Lookahead
    • [a-zA-Z0-9] - 第一个字符只能是字母数字。
    • .{0,62} - 后跟最多 62 个字符。
    • $ - 然后,字符串结束。
  • ) - 前瞻结束。
  • [a-zA-Z0-9\-]* - 匹配 0 个或多个字母数字字符或连字符。
  • [a-zA-Z0-9]$ - 匹配字符串末尾的一个字母数字字符。

如果您需要设置最小长度,只需将 {0,62} 更改为 {n,62},其中 n+1 是最小长度。或者您可以去掉 Lookahead(只要最小长度 >= 2)并使用:

^[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]$

...用 {n,61} 替换 {0,61} 其中 n+2 是最小长度。