使用Ruby String#scan
我想摘录自:
"8 12 13.5 145 foobar-123F 0.33 10"
这些结果:
['8', '12', '10']
但没有别的。
答案 0 :(得分:5)
如果您想要一个纯正的基于正则表达式的解决方案:
/(?<=\s|\A)\d{1,2}(?=\s|\Z)/
这使用正向lookbehind和正向前瞻来检查数字组是否仅被分隔符包围。
但是,我要做的是使用String#split对字符串进行标记,并过滤掉包含非数字字符的标记。在我看来,这会使代码更具可读性。例如:
s = "8 12 13.5 145 foobar-123F 0.33 10"
s.split.select { |token| token =~ /\A\d{1,2}\Z/ }
=> ["8", "12", "10"]
答案 1 :(得分:2)
您可以使用字边界和外观:
> "8 12 13.5 145 foobar-123F 0.33 10".scan(/(?<!\.)\b\d{1,2}\b(?!\.)/)
=> ["8", "12", "10"]
排除负数:
> "8 12 13.5 145 foobar-123F 0.33 10 -12".scan(/(?<![.\-])\b\d{1,2}\b(?!\.)/)
=> ["8", "12", "10"]