给定一个任意字母数字字符串:
The quick brown 12345678901234 fox jumped over 987654321, on his second try.
如果字符串中的其他数字长于9位,那么正则表达式可以提取长度正好为9位的连续数字字符串吗?
即,获取987654321
并忽略12345678901234
?
规则是“获取长度为9个字符的任意数字字符串,无论是无界的,还是有界的,都是由0-9以外的任何字符限定的。”
答案 0 :(得分:3)
这只匹配您的目标 (无需与群组玷污):
(?<!\d)\d{9}(?!\d)
请参阅live demo。
这使用环绕声来断言&#34;数字边界&#34;两端。环顾四周不要消耗任何东西,因此任何一方的角色都不是比赛的一部分 - 只有你的目标号码匹配。
此外,通过使用否定查看数字,而不是肯定环顾非数字,边界也匹配输入的开始/结束 - 因此输入的开头或结尾的9位数字仍然匹配。
答案 1 :(得分:0)
当然:
\b\d{9}\b
# a word boundary (ie space, punctuation, comma)
# exactly nine consecutive digits
# another boundary
<小时/>
提供另一个例子:
\D(\d{9})\D
# not a digit
# nine consecutive digits
# not a digit
使用this one,您需要再次使用$1
。但这取决于数字的位置。后者在字符串的开头或开始处不起作用(每侧需要正好一个字符)。数字的最佳选择是\b
。
答案 2 :(得分:0)
使用\b
绑定字符串不适用于The quick brown 12345678901234 fox jumped over xx987654321xx, on his second try
(以非数字为界),这样做:
(?:^|[^\d])(\d{9})(?:$|[^\d])
(开始/结束或非数字的非捕获组)
demo here
编辑:更简单的“现代”风格:
(?:^|\D)(\d{9})(?:$|\D)
Python测试(捕获几个9位数组):
import re
p=re.compile(r"(?:^|\D)(\d{9})(?:$|\D)")
print(re.findall(p,"The quick brown 12345678901234 fox jumped over 987654321dd, 123456789"))
给出:
['987654321', '123456789']