正则表达式空格限制不匹配
Regex spaces restriction not matching
我有以下正则表达式:^([^\s][a-zA-Z_\-]+\s)*([^\s][a-zA-Z_\-]+$)
执行以下操作:
开头没有 space
最后没有 spaces
中间没有双 spaces
但是它与这些字符串不匹配:
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
我有以下正则表达式:^([^\s][a-zA-Z_\-]+\s)*([^\s][a-zA-Z_\-]+$)
执行以下操作:
开头没有 space
最后没有 spaces
中间没有双 spaces
但是它与这些字符串不匹配:
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