正则表达式空间限制不匹配

时间:2018-01-30 19:00:16

标签: regex spaces

我有以下正则表达式:^([^\s][a-zA-Z_\-]+\s)*([^\s][a-zA-Z_\-]+$)

以下内容:

  • 开始时没有空格

  • 最后没有空格

  • 之间没有双重空格

但是它与这些字符串不匹配:

abd d

a bdc

它符合这些:

abd de

ab cde

所以我认为它除了提到的要点之外还做了其他事情,我需要它与abd d类型的例子相匹配。

它应该并且确实允许介于两者之间的单个空间,但正如您只能看到单个空间左侧和右侧的字符串长度为2或更多时所示。

我错过了什么?

2 个答案:

答案 0 :(得分:1)

问题在于[^\s]模式中需要非空格字符,它需要字符串中的字符串开始/结束和非空格块之间至少有2个字符。如果您将其删除,your pattern will work

但是,我建议在\之前删除不必要的-(在字符类的末尾,不需要转义-)并量化最后部分,接近结束,这样,它将需要更少的回溯:

^[a-zA-Z_-]+(?:\s[a-zA-Z_-]+)*$

请参阅regex demo

<强>详情

  • ^ - 字符串开头
  • [a-zA-Z_-]+ - 一个或多个ASCII字母,_-
  • (?:\s[a-zA-Z_-]+)* - 出现以下情况:
    • \s - 空白字符
    • [a-zA-Z_-]+ - 一个或多个ASCII字母,_-
  • $ - 字符串结束。

答案 1 :(得分:0)

这是我这样做的首选方式 永远不会出现回溯问题。

如果您将大量单个字母用空格分隔,这是更快捷的方法。

^[a-zA-Z_-](?:\s?[a-zA-Z_-])*$

https://regex101.com/r/dRpDYE/1

格式化

 ^                     # BOS
 [a-zA-Z_-]            # Single a-z, etc..
 (?:                   # Cluster 
      \s?                   # Optional space, the only place a space can match
      [a-zA-Z_-]            # Must be followed by single a-z, etc..
 )*                    # End cluster, do 0 to many times 
 $                     # EOS