【问题标题】:Lua regex to find a numeral in a stringLua 正则表达式在字符串中查找数字
【发布时间】:2019-11-03 17:01:33
【问题描述】:

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

【问题讨论】:

  • 这个怎么样? '([+-]?%d*%.?%d+)'
  • 但是如果你有+1.23.45,那么预期的结果是什么?请告知您需要处理的所有可能的边缘情况。您需要验证整个字符串输入,还是从一个大字符串中提取多个可能的匹配项?
  • 谢谢,这样更安全。只是给朋友的一点天文(行迹)数学,我以为这次我会一起学习 Lua。

标签: lua lua-patterns


【解决方案1】:

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

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

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

*(虽然,实际上它与您的 RE \[+-\]?(\d+(\.\d+)?|\.\d+) 相同,但没有指数部分..
如果我更喜欢更完整的 RE,例如 this: ^[+-]?((\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 文本解析库。

【讨论】:

  • 谢谢,在修改的时候发现wiki里的大RE。有人会认为这必须已经内置到 Lua 基础中,因为它处理各种数字,并且是预先编写的,它源于处理文本配置文件。猜猜所有工业用途都必须有一个或另一个附加文本解析库以及更多
  • Lua 单独做的不多,这是真的。这里有一些 Lpeg Recipes 展示了如何匹配请求的数字模式,这里是 LPEG and regex' 的有用比较。
  • 实际上可以满足大多数需求,包括在
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-20
  • 2016-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多