正则表达式匹配字符串

4
我希望匹配所有符合以下规则的字符串 -
  • 应该由小写字母、数字和破折号组成
  • 应以字母或数字开头
  • 应以字母或数字结尾
  • 总字符串长度应至少为3个字符,最多为20个字符
  • . 是可选的,不应有两个或更多连续的点 .
  • 破折号 - 是可选的,不应有两个或更多连续的破折号 -
  • . 和破折号 - 不应该连续 //字符串 aaa.-aaabbb 无效
  • 不允许下划线

我想到了这个正则表达式:

^[a-z0-9]([a-z0-9]+\.?\-?[a-z0-9]+){1,18}[a-z0-9]$

[a-z0-9] //should start/end with a letter or a number
([a-z0-9]+\.?\-?[a-z0-9]+){1,18}  //other rules

然而,在某些情况下,它会失败,例如 -
abcdefghijklmnopqrstuvwxyz //should fail total number of chars greater than 20  
aaa.-aaabbb //should fail as dot '.' and dash '-' are consecutive

请问有人可以帮我纠正这个正则表达式吗?

2个回答

3
您可以通过使用“预测先行断言”来实现该功能:了解更多
^(?!.*[.-]{2})[a-z0-9][a-z0-9.-]{1,18}[a-z0-9]$

说明:

^                # Start of string
(?!              # Assert that the following can't be matched:
 .*              #  Any number of characters
 [.-]{2}         #  followed by .. or -- or .- or -.
)                # End of lookahead
[a-z0-9]         # Match lowercase letter/digit
[a-z0-9.-]{1,18} # Match 1-18 of the allowed characters
[a-z0-9]         # Match lowercase letter/digit
$                # End of string

非常感谢 Tim 快速回复并提供 Lookahead 链接的指引 :-) - inutan

1
我想到了一个方法,它使用了类似于Tim解决方案的负向先行断言,但应用方式不同。因为它只在看到点或破折号时才进行前瞻,所以可能不需要做太多回溯,这可能会使其表现略微更快。
^[a-z0-9]([a-z0-9]|([-.](?![.-]))){1,18}[a-z0-9]$

解释:

^                  # Start of string
[a-z0-9]           # Must start with a letter or number
(                  # Begin Group
   [a-z0-9]        # Match a letter or number
   |               # OR
   ([-.](?![.-]))  # Match a dot or dash that is not followed by a dot or dash
){1,18}            # Match group 1 to 18 times
[a-z0-9]           # Must end with a letter or number
$                  # End of string

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接