【问题标题】:Regex which accepts alphanumerics only, except for one hyphen in the middle仅接受字母数字的正则表达式,中间有一个连字符
【发布时间】:2013-07-11 17:13:41
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我不认为这是完全可以用正则表达式完成的事情。匹配模式然后在之后(或事先)检查总长度会更容易。

标签: javascript regex validation


【解决方案1】:
/^[a-zA-Z0-9]+\-?[a-zA-Z0-9]+$/

可以简化为

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

因为如果没有破折号,则无需在其后查找更多字母,并且可以使用i 标志进行不区分大小写的匹配,避免重复小写和大写字母。

然后把你的问题分成两种情况:

  1. 9-20 个字母数字
  2. 10-21 个字符,除了一个破折号外,所有字符都是字母数字

您可以使用积极的前瞻来检查第二个,例如

/^(?=.{10,21}$)/i

在不消耗字符的情况下检查字符数。

将这些结合在一起可以得到您

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

【讨论】:

  • 感谢您的回复。前瞻是为了检查长度进行表达式吗?我们可以在计算字符串中的字符数时忽略连字符吗?
【解决方案2】:

如果您不希望 - 恰好出现在中间,您可以这样做

 /^(?=[^-]+-?[^-]+$)[a-zA-Z\d-]{9,20}$/ 

[^-] 匹配任何不是- 的字符

【讨论】:

  • 您为什么使用{10,21} 来检查 9 到 20 个字符?
  • Anirudh,我不希望连字符正好在中间。它是字符串中的可选字符,不应计入字符串的长度。感谢您的回复。
  • 我认为@kranthi 的意思是整个字符串(包括破折号)应该是 9 到 20。
  • @BrianStephens 你是对的 brian..我已经编辑了 ans..thx
  • 我的意思是以下字符串是有效的:abcd12345 是有效的。 abcd-1234 无效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-12
  • 2013-11-18
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
相关资源
最近更新 更多