如何使用VB脚本中的正则表达式处理浮点数

时间:2016-06-23 13:40:16

标签: regex vbscript

我想在下面的字符串中使用子匹配获取数字,如果我的字符串包含整数(不含小数)或浮点数

,我不知道如何处理

请在下面的代码中纠正我的错误。

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

1 个答案:

答案 0 :(得分:2)

您的表达式匹配数字正常,但在错误的地方不匹配。要了解原因,我们只考虑以下字符串中(Quantity.*)(\d{1,})匹配的内容:

Quantity:12.23

Here’s the result of that match:

  • 整场比赛:Quantity:12
    • 第1组:Quantity:1
    • 第2组:2

- 问题是.* 贪婪并尽可能匹配,包括数字。然后它回溯,以便它可以匹配其第二组中的至少一个数字(\d{1,})。但是你想在那里得到所有数字。

有几种方法可以解决这个问题,但最简单的方法是让你的表达更具体:而不是一切(.),只需匹配非数字:

(.*Quantity\D*)+(\d{1,})

此外,您不需要+量词,\d{1,}可以缩短为\d+。在表达式的其余部分中,您可以将匹配的整数和小数连接在一起,只需使小数部分可选:

.*Quantity\D*(\d+(?:\.\d+)?).*

(?:…)仅表示不会捕获此群组; the parentheses are merely to enforce operator precedence。)

最后,请注意,这将与10.23匹配,但不会与1.匹配,也不会与.23匹配。虽然这是完全正常的,但在小数点前面省略一个前导零点有点常见(特别是在美式拼写中)。