我试图匹配空格包围的数字,比如这个字符串: " 1 2 3"
我很困惑为什么正则表达式\s[0-9]\s
匹配1和3而不是2.为什么会发生这种情况?
答案 0 :(得分:1)
更确切地说,只有当您逐个浏览字符串\s[0-9]\s
中的所有匹配项时,正则表达式2
才会与" 1 2 3 "
不匹配。如果您尝试在第1或第2位开始匹配," 2 "
将匹配。
原因是\s
正在捕获输入的一部分 - 即数字周围的空格。当您匹配" 1 "
时,1
和2
之间的空格已被占用;正则表达式引擎正在查看字符串的尾部,即"2 3 "
。此时,2
前面没有引擎可以捕获的空间,因此直接找到" 3 "
要解决此问题,请将空格放入零长度look-arounds,如下所示:
(?<=\s)[0-9](?=\s)
现在引擎确保数字前后有空格,而消耗这些空格作为匹配的一部分。这样,引擎就可以将1
和2
之间的空格视为1
后面的空格,也可以将2
前面的空格视为空格,从而返回两个匹配项。