我有以下正则表达式:^([^\s][a-zA-Z_\-]+\s)*([^\s][a-zA-Z_\-]+$)
以下内容:
开始时没有空格
最后没有空格
但是它与这些字符串不匹配:
abd d
a bdc
它符合这些:
abd de
ab cde
所以我认为它除了提到的要点之外还做了其他事情,我需要它与abd d类型的例子相匹配。
它应该并且确实允许介于两者之间的单个空间,但正如您只能看到单个空间左侧和右侧的字符串长度为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