正则表达式查找 space 分隔的数字

Regular Expression find space delimited numbers

我有一个来自用户通过消息传递系统输入的字符串,它可以包含一系列 4 位数字,但由于用户很可能会输入错误的内容,因此需要稍微灵活一些。 因此,我想让他们输入数字,或者用任何字符串填充他们的消息,然后只取与格式匹配的数字

=nnnn or nnnn

为此我有正则表达式:

(^|=|\s)\d{4}(\s|$)

这几乎可以工作,但是因为它说每组 4 位数字必须以 =、space 或字符串开头,所以它错过了所有其他数字组

我试过这个:

(^|=|\s*)\d{4}(\s|$)

但这意味着匹配 space 后的任何四位数字 - 这是不正确的。

如何匹配数字组,但在一组的末尾和下一组的开头包含一个 space,以阐明此字符串:

Ack 9876 3456 3467 4578 4567

应该产生匹配项:

9876
3456 
3467 
4578 
4567

这里需要使用不消耗任何字符的lookarounds。

(?:^|[=\s])\K\d{4}(?=\s|$)

(?:^|[=\s])(\d{4})(?=\s|$)

DEMO

你的正则表达式 (^|=|\s)\d{4}(\s|$) 失败了,因为起初它会匹配 <space>9876<space> 然后它会寻找另一个 space 或等于或行的开头。所以现在它在 <space>3467<space> 找到下一个匹配项。它不会匹配 3456,因为 3456 之前的 space 已经在第一场比赛中消耗掉了。为了进行重叠匹配,您需要将模式放在正环视中。因此,当您将最后一个模式 (\s|$) 放入前瞻中时,它不会消耗 space,它只是断言匹配后必须跟一个 space 或行边界的结尾。

\b\d+\b

\b 断言位置在单词边界 (^\w|\w$|\W\w|\w\W)。它是一个宽度为 0 的锚点,很像 ^$。它不消耗任何字符。

Demo

(?:^|(?<=[=\s]))\d{4}\b

Demo