\s+不能匹配所有的空格吗?

5

我正在尝试匹配这个字符串:

Text 18 19 Text

使用这个正则表达式:

\s+\d\d\s+

这个字符串有两个数字,每个数字都被前导和尾随的空格包围。

所以我想 - 这应该给我18和19对吧?但事实并非如此,它只给了我18。

我正在使用这个测试器进行测试:http://java-regex-tester.appspot.com/

谢谢!

3个回答

8
您没有匹配到第二个项目的原因是,1819之间的空格被第一个匹配项的末尾\s+“消耗”了。您应该使用非消耗性零宽度正则表达式来匹配尾随的空格,例如使用前瞻语法或零宽度边界标记。
\s+\d\d(?=\s+)

讲解得很好,这篇文章给我留下了深刻的印象。 - Bhavik Ambani

5
请使用以下内容:
\b\d\d\b

你的正则表达式没有匹配到第二个数字,因为第一个匹配已经“吃掉”了所有空格。
与此同时,\b是一个“单词边界”,被称为零宽度(元)字符:它在匹配时不会“吃掉”任何内容。

太棒了。不过我很好奇,为什么\b不会吞掉空格而\s会呢? - David
@David - 请看编辑。这是几个旨在成为零宽度的正则表达式构造之一。另一个值得注意的是前瞻,你也可以使用:\s+\d\d(?=\s) - Andrew Cheong
请注意,如果有两位数的结尾,也会捕获它。 - Anirudha
@Fake.It.Til.U.Make.It - 是的,\b\d\d\b 会在开头和结尾都匹配,我想这是个好事情。另一方面,\s+\d\d(?=\s) 无法捕获开头或结尾的两个数字,这可能不是预期的结果。 - Andrew Cheong

3

因为首次解析输出为"18",剩余的字符串是"19 Text",这不符合匹配条件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接