Lua正则表达式:在字符串中查找数字

Lua中如何正确匹配字符串中的数字?由于Lua正则表达式中括号的使用方式,似乎很难正确匹配小数点和小数点后的数字。

下面的测试代码中的解决方法可以满足我的脚本需要,但是它也可以接受像+1.23.45这样的模式。

--[+-]?(\d+(\.\d+)?|\.\d+)([eE][+-]?\d+)?  std regex for a numeral

s = "+1.23"
re = "([+-]?%d+[%.%d+]*)"
n = s:match (re)
print (n)
点赞
用户8291949
用户8291949

如果你坚持使用像常规正则表达式中所示的松散定义的数字值,我们就会遇到问题,因为 Lua 模式不支持交替操作 |

建议使用的模式 ([+-]?%d*%.?%d+) 实际上适用于大多数情况,但是,如果您还想允许像 PCRE 一样的情况,例如 42.,则会失败。

我们可以尝试使用括号和一个可选的额外点,在这种情况下点会掉落:([+-]?%d*%.?%d+)%.? 这接近了,但是如果没有跟在数字后面,则会去掉最后一个点,因此会返回错误的结果,例如 .12. 返回 .12。\*

(虽然,实际上它与您的 RE [+-]?(\d+(\.\d+)?|\.\d+) 没有指数部分是一样的。)

如果需要完整的 RE,我更喜欢像 这个 这样的模式:^[+-]?((\d+(\.\d*)?)|(\.\d+))$

演示代码:

re = "^([+-]?%d*%.?%d+)%.?$"
v = {'123', '23.45', '.45', '-123', '-273.15', '-.45', '+516', '+9.8', '+.5', -- regular matches
     '34.', '+2.', '-42.', --only matched by prolematic last optional dot
     '.', '-.', '+.', ' ', '', --expected no matches
     '.12.', '+.3.', '-.1.', --false positives (strictly speaking)
     '+1.23.45' -- no matches
}
for i, v in ipairs(v) do
    n = v:match (re)
    print (n)
end

我认为第一个建议的选项是可接受的。如果第二个版本仍然无法满足需求,我建议尝试 lrexlib,这是一个多种风味的正则表达式库,或者 LPeg,这是一个强大的 Lua 文本解析库。

2019-06-20 22:41:41