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

时间:2015-03-24 12:07:11

标签: regex expression match

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

=nnnn or nnnn

为此,我有正则表达式:

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

这几乎可以工作,但是因为它说每组4个数字必须以=,空格或字符串的开头开头,它错过了每一组其他数字

我试过了:

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

但这意味着任何四位数后跟一个空格都会匹配 - 这是不正确的。

如何匹配数字组,但在一个组的末尾包含一个空格,并在下一个组的开头包含一个空格,以澄清此字符串:

Ack 9876 3456 3467 4578 4567

应该产生匹配:

9876
3456 
3467 
4578 
4567

2 个答案:

答案 0 :(得分:2)

在这里,您需要使用不会消耗任何字符的外观。

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

OR

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

DEMO

您的正则表达式(^|=|\s)\d{4}(\s|$)失败,因为首先它会匹配<space>9876<space>,然后它会寻找另一个空格或等于或开始该行。所以现在它在<space>3467<space>找到下一场比赛。它与3456不匹配,因为3456之前的空格已在第一场比赛中消耗。为了进行重叠匹配,您需要将模式置于正面看法中。因此,当您将最后一个模式(\s|$)置于预测中时,它将不会占用空间,它只是断言匹配必须后跟行边界的空格或末尾。

答案 1 :(得分:0)

\b\d+\b

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

Demo

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

Demo