名称类型的正则表达式

时间:2018-06-10 13:58:52

标签: regex regex-lookarounds

我正在使用以下条件的正则表达式:

  1. 必须包含1到63个字母数字字符或连字符。
  2. 第一个字必须是一个字母。
  3. 不能以连字符结尾或包含两个连续的连字符。
  4. 我能够获得正则表达式:    ^[a-zA-Z0-9](?!.*--)[a-zA-Z0-9-]{0,61}[A-Za-z0-9]$

    但是它在长度约束上失败了,并允许像" a - "这样的模式。我怎样才能满足条件?

2 个答案:

答案 0 :(得分:2)

我会将您的要求描述为:

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

Demo

以下是对上述正则表达式各部分的简要说明:

^              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 :(得分:2)

我对此的看法是:

^[A-Za-z](?!.*?--)[A-Za-z0-9\-]{0,62}(?<!-)$

Try it out here

<强>解释

  • ^ - 匹配字符串的开头。
  • [A-Za-z] - 匹配第一个字母。
  • (?!.*?--) - 确保字符串的其余部分没有连续两个连字符。
  • [A-Za-z0-9\-]{0,62} - 匹配剩余的字母数字和连字符。
  • (?<!-) - 确保字符串不以连字符结尾。
  • $ - 匹配字符串的结尾。