Regex只接受字母数字,除了在中间的一个连字符

Regex which accepts alphanumerics only, except for one hyphen in the middle

本文关键字:在中间 连字符 一个 数字 Regex      更新时间:2023-09-26

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

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

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

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

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

/^[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

您可以这样做,前提是您不希望-正好出现在的中间

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

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