正则表达式查找 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|$)
你的正则表达式 (^|=|\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 的锚点,很像 ^
和 $
。它不消耗任何字符。
或
(?:^|(?<=[=\s]))\d{4}\b
我有一个来自用户通过消息传递系统输入的字符串,它可以包含一系列 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|$)
你的正则表达式 (^|=|\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 的锚点,很像 ^
和 $
。它不消耗任何字符。
或
(?:^|(?<=[=\s]))\d{4}\b