我有一个字符串来自用户通过消息传递系统输入,这可能包含一系列4位数字,但由于用户可能输入错误的内容,因此需要有点灵活。 因此,我想允许他们输入数字,或者用任何字符串来填充他们的信息,然后只取与格式匹配的数字
=nnnn or nnnn
为此,我有正则表达式:
(^|=|\s)\d{4}(\s|$)
这几乎可以工作,但是因为它说每组4个数字必须以=,空格或字符串的开头开头,它错过了每一组其他数字
我试过了:
(^|=|\s*)\d{4}(\s|$)
但这意味着任何四位数后跟一个空格都会匹配 - 这是不正确的。
如何匹配数字组,但在一个组的末尾包含一个空格,并在下一个组的开头包含一个空格,以澄清此字符串:
Ack 9876 3456 3467 4578 4567
应该产生匹配:
9876
3456
3467
4578
4567
答案 0 :(得分:2)
在这里,您需要使用不会消耗任何字符的外观。
(?:^|[=\s])\K\d{4}(?=\s|$)
OR
(?:^|[=\s])(\d{4})(?=\s|$)
您的正则表达式(^|=|\s)\d{4}(\s|$)
失败,因为首先它会匹配<space>9876<space>
,然后它会寻找另一个空格或等于或开始该行。所以现在它在<space>3467<space>
找到下一场比赛。它与3456
不匹配,因为3456
之前的空格已在第一场比赛中消耗。为了进行重叠匹配,您需要将模式置于正面看法中。因此,当您将最后一个模式(\s|$)
置于预测中时,它将不会占用空间,它只是断言匹配必须后跟行边界的空格或末尾。
答案 1 :(得分:0)