Lua 用于在字符串中查找数字的正则表达式

Lua regex to find a numeral in a string

在 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)

如果您坚持像常规正则表达式中显示的那样对数值进行松散定义,我们就会遇到麻烦,因为 lua-patterns 不支持交替操作 |

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

我们可以尝试使用括号和一个可选的额外点,在这种情况下会脱落:([+-]?%d*%.?%d+)%.?这很接近,但如果后面没有数字则删除最后一个点,因此 returns 像 .12..12 这样的误报。 *

*(虽然,实际上它与没有指数部分的 RE \[+-\]?(\d+(\.\d+)?|\.\d+) 相同..
如果我更喜欢像 this 这样更完整的 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, a multi-flavor regex library, or LPeg,一个强大的文本解析库 Lua.