禁止连续出现超过1个破折号的正则表达式

22
  1. 我该如何禁止--(超过1个连续的-)? 例如: ab--c
  2. 不允许单词末尾出现-, 例如:abc-
  3. 不允许单词开头出现-, 例如:-abc

^[A-Za-z0-9-]+$是我目前为止的正则表达式。

5个回答

42
^(?!-)(?!.*--)[A-Za-z0-9-]+(?<!-)$

解释:

^             # Anchor at start of string
(?!-)         # Assert that the first character isn't a -
(?!.*--)      # Assert that there are no -- present anywhere
[A-Za-z0-9-]+ # Match one or more allowed characters
(?<!-)        # Assert that the last one isn't a -
$             # Anchor at end of string

抱歉,这也不匹配abd-。 - Sachin Shanbhag
@Brian:你说得对。我只是想不通为什么Firefox拒绝了Tim的请求。 - Martijn
@Martijn,显然javascript不支持负回顾 - Brian Reichle
@Brian:是的,就是这样(谢谢链接,很有趣的文章)。解决这个问题的一种方法是分别检查一字符和两字符的字符串:^([^-]{0,2}|[^-]+(?!.*--).*[^-]+)$(http://jsbin.com/ujoxu3/2) - Martijn
@Martijn:我的答案和Tim的回答,以及问题中提供的起点都只允许使用字母数字字符和连字符。如果你想要任何字符,那么它可以简单地修改为^[^-]+(-[^-]+)* - Brian Reichle
显示剩余6条评论

40

^[A-Za-z0-9]+(-[A-Za-z0-9]+)*$

使用这个正则表达式,破折号仅在组内匹配。该连字符具有在每侧出现的[A-Za-z0-9]+子表达式。由于此子表达式匹配一个或多个字母数字字符,因此无法在开头、结尾或紧邻另一个连字符处匹配。


太聪明了!可能比我所有的环视内容更容易理解。 - Tim Pietzcker
4
根据我的理解,@Sachin的意思是他完全明白原帖想表达什么。不过,OP可能需要更明确地表达自己的意思。 - Tim Pietzcker
@Tim - 哎呀...完全误解了问题。 @Brian - 绝对没错。这就是为什么我试图在我的正则表达式中匹配-abd和abd-...谢谢,抱歉。 - Sachin Shanbhag
@Brian:你似乎忽略了原帖的第一个要求:禁止连续的连字符。 - Martijn
@Martijn:不,它能正常运行。连字符只会在组内作为单个连字符字符匹配,并且必须始终在前后至少跟随一个字母数字字符。它之所以未通过您的测试,是因为您在测试时使用了空格和标点符号,而问题暗示这些字符是不允许的(由提供的起点)。如果要包括这些字符,请使用 ^[^-]+(-[^-]+)* - Brian Reichle
2
@Brian:你说得对。这确实比前瞻更优雅(而且更快)。+1 :-) - Martijn

2
尝试: ^([a-zA-Z0-9]+[-]{1})*[a-zA-Z0-9]+$ 正则表达式101链接: https://regex101.com/r/xZ2g6p/1 这允许在两组字符之间只有一个连字符,并阻止其在字符集的开头和结尾。

2
^[a-zA-Z0-9](?!.*--)[a-zA-Z0-9-]*[a-zA-Z0-9]$

^[a-zA-Z0-9]     /*Starts with a letter or a number*/
(?!.*--)         /*Doesn't include 2 dashes in a row*/
[a-zA-Z0-9-]*    /*After first character, allow letters or numbers or dashes*/
[a-zA-Z0-9]$     /*Ends with a letter or a number*/

匹配:

重新播放 / 重新播放过

不匹配:

重播- / 重--播 / -重播


1
如果字符串开头或结尾不允许出现“-”,则您正在搜索一个序列,该序列由“一个或多个字母数字字符,后跟一个或多个由一个破折号后跟一个或多个字母数字字符的组”组成。
/[0-9A-Z]+(-[0-9A-Z]+)+/

“简单”是正则表达式中的一个宝贵座右铭。 (注:若要搜索小写字符,请添加它们。出于清晰考虑,我没有添加)


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