我想在下面的字符串中使用子匹配获取数字,如果我的字符串包含整数(不含小数)或浮点数
,我不知道如何处理请在下面的代码中纠正我的错误。
str="Added Quantity:12.23 Pass"
Set oReg=New RegExp
oReg.pattern="(.*Quantity.*)+((\d{1,})|(\d{1,}\.\d{1,}))(.*)"
set r=oReg.execute(str)
for i=0 to r.count-1
print r.item(1).submatches(i)
next
答案 0 :(得分:2)
您的表达式匹配数字正常,但在错误的地方不匹配。要了解原因,我们只考虑以下字符串中(Quantity.*)(\d{1,})
匹配的内容:
Quantity:12.23
Here’s the result of that match:
Quantity:12
Quantity:1
2
- 问题是.*
贪婪并尽可能匹配,包括数字。然后它回溯,以便它可以匹配其第二组中的至少一个数字(\d{1,}
)。但是你想在那里得到所有数字。
有几种方法可以解决这个问题,但最简单的方法是让你的表达更具体:而不是一切(.
),只需匹配非数字:
(.*Quantity\D*)+(\d{1,})
此外,您不需要+
量词,\d{1,}
可以缩短为\d+
。在表达式的其余部分中,您可以将匹配的整数和小数连接在一起,只需使小数部分可选:
.*Quantity\D*(\d+(?:\.\d+)?).*
((?:…)
仅表示不会捕获此群组; the parentheses are merely to enforce operator precedence。)
最后,请注意,这将与1
和0.23
匹配,但不会与1.
匹配,也不会与.23
匹配。虽然这是完全正常的,但在小数点前面省略一个前导零点有点常见(特别是在美式拼写中)。