我有以下类型的字符串,其中包含数字:
(12 - 17)
(4.5 - 5.5)
(4 - 10)
我的代码适用于前两个示例,如下所示:
def numbers=range=~/\d{1,3}.?\d{1,2}?/
其中数字的结果是:
[12,17]
[4.5,5.5]
但最后只是
[10]
它无法获得4
。
有谁看到我错在哪里?
答案 0 :(得分:4)
你的正则表达式至少需要2个整数位。看:\d{1,3}
匹配1到3位数,.?
匹配任何字符,但换行符1或0次(可选)和\d{1,2}?
匹配1或2位数({1,2}?
是限制量词的 lazy 版本意味着它将匹配尽可能少的数字以返回有效匹配。)
使用
/\d{1,3}(?:\.\d{1,2})?/
请参阅regex demo。
<强>解释强>:
\d{1,3}
- 1至3位数字(?:\.\d{1,2})?
- 1或0个序列(由于?
):
\.
- 文字句号\d{1,2}
- 2位或1位数(这是限制量词的贪婪版本)。这是Groovy demo:
def x = "(12 - 17)(4.5 - 5.5)(4 - 10)"
def res = x.findAll(/\d{1,3}(?:\.\d{1,2})?/)
println res
输出:[12, 17, 4.5, 5.5, 4, 10]