只接受字母数字的正则表达式,除了中间的一个连字符

时间:2013-07-11 17:13:42

标签: javascript regex validation

我正在尝试构建一个只接受字母数字([a-zA-Z0-9])的正则表达式,除了字符串中间的单个连字符(-),最少9个字符和一个最多20个字符。

我已经验证了以下表达式,它接受中间的连字符。

/^[a-zA-Z0-9]+\-?[a-zA-Z0-9]+$/ 

如何为上述正则表达式设置最小9个字符和最多20个字符?我已经在上面的表达式中使用了量词+?

我如何将{9,20}应用于上述表达式?表达式还有其他建议吗?

2 个答案:

答案 0 :(得分:1)

如果您不希望-完全出现在中间

,则可以执行此操作
 /^(?=[^-]+-?[^-]+$)[a-zA-Z\d-]{9,20}$/ 

[^-]匹配任何不是-

的字符

答案 1 :(得分:1)

/^[a-zA-Z0-9]+\-?[a-zA-Z0-9]+$/

可以简化为

/^[a-z0-9]+(?:-[a-z0-9]+)?$/i

因为如果没有破折号,那么你不需要在它之后查找更多的字母,你可以使用i标志来区分大小写,并避免重复小写和高位 - 大写字母。

然后将您的问题分成两种情况:

  1. 9-20 alpha numerics
  2. 10-21个字符,除了一个短划线外都是字母数字
  3. 您可以使用像

    这样的积极前瞻来检查第二个
    /^(?=.{10,21}$)/i
    

    检查字符数而不消耗它们。

    将这些组合在一起可以为您提供

    /^(?:[a-z0-9]{9,20}|(?=.{10,21}$)[a-z0-9]+-[a-z0-9]+)$/i