Regex 如何使用正则表达式匹配单个空间总数而不仅仅是单个空间

Regex 如何使用正则表达式匹配单个空间总数而不仅仅是单个空间,regex,Regex,这是我目前拥有的,它将匹配字母数字字符和空格: ^[a-z0-9\s]+$ 我想做的是确保只有在空间不超过一(1)个时才有匹配。上面的内容将匹配“thisatest”,但我只希望在输入为“thisatest”或“thisatest”时匹配。一旦总空间超过一个,它将不再匹配 理想情况下,它也不会匹配,如果空间是领先或落后,但这只是结冰 编辑: 其想法是,这将用于在创建帐户时验证帐户名。帐户名只能包含拉丁字母、数字和单个空格。但是,它可以是所有字母或所有数字,不需要空格。这绝对是关于空格而不是空格

这是我目前拥有的,它将匹配字母数字字符和空格:

^[a-z0-9\s]+$
我想做的是确保只有在空间不超过一(1)个时才有匹配。上面的内容将匹配“thisatest”,但我只希望在输入为“thisatest”或“thisatest”时匹配。一旦总空间超过一个,它将不再匹配

理想情况下,它也不会匹配,如果空间是领先或落后,但这只是结冰

编辑: 其想法是,这将用于在创建帐户时验证帐户名。帐户名只能包含拉丁字母、数字和单个空格。但是,它可以是所有字母或所有数字,不需要空格。这绝对是关于空格而不是空格的问题。

试试:

^[a-z0-9]+(?: [a-z0-9]+)?$
^[a-z0-9]+(?: [a-z0-9]+)?$

(已编辑:后续内容建议您检查空格,而不是空格)。

这相当简单,只需将其分块构建即可

^[a-z0-9]+(?: [a-z0-9]+)?$

一个或多个字母数字,然后是由一个空格后跟一个或多个字母数字组成的可选组。(顺便说一句,
\s
匹配的是空白字符,而不是空格。也就是说,它实际上匹配的是
[\t\n]
。您实际上想要哪个?

应该像这样简单。在文本中间匹配0或1个空白字符。虽然它也和标签匹配

[a-z0-9]+\s{0,1}[a-z0-9]+

将允许atmost在两者之间留出一个空间

^[a-zA-Z0-9]+\s?[a-zA-Z0-9]+$

将在两者之间留出一个空间

^[a-zA-Z0-9]+\s[a-zA-Z0-9]+$

EDIT1:

上述解决方案不接受单个字符串

以下解决方案也匹配单个字符串


^[a-zA-Z0-9]+([[a-zA-Z0-9]+)?$

首先通过修剪前导和尾随空格来清除用户名

^[a-z0-9]+(?: [a-z0-9]+)?$

这似乎忽略了第一个字符,即使第一个字符不是空格。@Reality Extractor:具体来说,我不确定,但我设法在地板上放了一个尾随的
$
,没有它,正则表达式可能什么都没用。(虽然我不能从结果中完全理解您的意思。)测试
printf'aaa bbb\na b a b b\n a b a b a\n nabab\n ba b\nav d\n ac\nde\n'| perl-lne'print if/^[a-z0-9]+(?:[a-z0-9]+)$/“
对我来说做得很好。它还匹配了前导空格和尾随空格。*应该是+。此正则表达式将无法匹配单个字符串。我认为匹配单个字符不是询问者所必需的,因为这也意味着匹配“ThisisTest”编辑:它是询问者在其编辑版本中所必需的。此正则表达式将无法匹配单个字符串。按“不超过1空格”是指0还是1,ie是否也要匹配“ThisisTest”?是的,就像在我的第一次编辑中一样,用户名可以是“ThisisTest”,它不必有空格,但如果有,则不应超过一个空格。所以这实际上至少是0,不超过1。不确定放在搜索标记前面的正向前瞻断言是否会按预期执行。AFAIK前瞻断言放在目标令牌后面
foo(?=bar)
将找到所有
foo
,后跟
bar
。另一方面,
(?!bar)foo
将无条件地匹配所有
foo
。即使前面有
bar
所有格量词,在这里也绝对没有必要。远离的。