【问题标题】:Regex for name type名称类型的正则表达式
【发布时间】:2018-06-11 00:05:20
【问题描述】:

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

  1. 必须包含 1 到 63 个字母数字字符或连字符。
  2. 第一个字符必须是字母。
  3. 不能以连字符结尾或包含两个连续的连字符。

我能够得到像这样的正则表达式: ^[a-zA-Z0-9](?!.*--)[a-zA-Z0-9-]{0,61}[A-Za-z0-9]$

但它在长度约束上失败了,并且允许像“a-”这样的模式。如何满足条件?

【问题讨论】:

    标签: regex regex-lookarounds


    【解决方案1】:

    我会将您的要求表述为:

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

    最后部分表示匹配最后一个字符,该字符是字母数字,但不是破折号,可能前面有字母数字字符或破折号。

    【讨论】:

    • 谢谢!你能告诉我“-”前面的“\”代表什么吗?
    • @FellowBeginner 我正在转义字符类中的破折号。您实际上不必这样做,因为我把它放在最后,但这样做被认为是最佳做法。
    • 先生,您能告诉我为什么您不使用(?!\-\-) 而不是(?!.*--) 吗? +1 来自我
    • 因为(?!--) 只是说断言不会从该位置出现两个破折号。我们要确保两个破折号不会出现在字符串中的任何地方
    【解决方案2】:

    我对此的看法是:

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

    Try it out here

    说明:

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

    【讨论】:

      猜你喜欢
      • 2010-09-21
      • 2011-05-11
      • 2019-08-09
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      相关资源
      最近更新 更多