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

Regex spaces restriction not matching

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

执行以下操作:

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

abd d

a bdc

它与这些匹配:

abd de

ab cde

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

它应该并且确实允许在它们之间插入一个 space,但是正如您所看到的,只有当单个 space 左右两侧的字符串长度为 2 或更多时。

我错过了什么?

问题在于模式中的 [^\s] 需要非空白字符,它在字符串 start/end 和字符串内的非空白块之间至少需要 2 个字符。如果删除它们,your pattern will work.

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

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

参见regex demo

详情

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

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

如果您有很多用空格分隔的单个字母,这是更快的方法。

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