【发布时间】:2018-06-11 00:05:20
【问题描述】:
我正在使用具有以下条件的正则表达式:
- 必须包含 1 到 63 个字母数字字符或连字符。
- 第一个字符必须是字母。
- 不能以连字符结尾或包含两个连续的连字符。
我能够得到像这样的正则表达式:
^[a-zA-Z0-9](?!.*--)[a-zA-Z0-9-]{0,61}[A-Za-z0-9]$
但它在长度约束上失败了,并且允许像“a-”这样的模式。如何满足条件?
【问题讨论】:
我正在使用具有以下条件的正则表达式:
我能够得到像这样的正则表达式:
^[a-zA-Z0-9](?!.*--)[a-zA-Z0-9-]{0,61}[A-Za-z0-9]$
但它在长度约束上失败了,并且允许像“a-”这样的模式。如何满足条件?
【问题讨论】:
我会将您的要求表述为:
^(?=.{1,63}$)(?!.*--)[a-zA-Z]([a-zA-Z0-9\-]*[a-zA-Z0-9])?$
以下是上述正则表达式各部分作用的简要说明:
^ from the start of the match
(?=.{1,63}$) assert that the string is between 1 63 characters
(?!.*--) assert that two hyphens do not appear together anywhere
[a-zA-Z] first character is a letter (mandatory in all matches)
([a-zA-Z0-9\-]*[a-zA-Z0-9])?
最后部分表示匹配最后一个字符,该字符是字母数字,但不是破折号,可能前面有字母数字字符或破折号。
【讨论】:
(?!\-\-) 而不是(?!.*--) 吗? +1 来自我
(?!--) 只是说断言不会从该位置出现两个破折号。我们要确保两个破折号不会出现在字符串中的任何地方。
我对此的看法是:
^[A-Za-z](?!.*?--)[A-Za-z0-9\-]{0,62}(?<!-)$
说明:
^ - 匹配字符串的开头。[A-Za-z] - 匹配第一个字母。(?!.*?--) - 确保字符串的其余部分没有两个连续的连字符。[A-Za-z0-9\-]{0,62} - 匹配剩余的字母数字和连字符。(?<!-) - 确保字符串不以连字符结尾。$ - 匹配字符串的结尾。【讨论】: