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