如何在Lua中编写这个正则表达式?

时间:2011-05-31 18:53:16

标签: regex lua pattern-matching

我是Lua正则表达式等价函数的新手,我需要编写以下正则表达式,它应该匹配带小数的数字

\b[0-9]*.\b[0-9]*(?!])

基本上,它匹配十进制格式的数字(例如:1,1.1,0.1,0.11),它们不以']'结尾,我一直试图用Lua使用{{1}编写这样的正则表达式但是我对Lua匹配表达式缺乏经验......

谢谢!

2 个答案:

答案 0 :(得分:6)

Lua没有正则表达式,主要是因为一个完整的正则表达式库会比Lua本身更大。

Lua所代替的是matching patterns,它的功能不那么强大(但对于许多用例来说仍然足够):

  • 没有“字边界”匹配器,
  • 没有其他选择,
  • 也没有前瞻或类似。

我认为没有Lua模式可以匹配你的字符串的每一个可能的出现,而没有其他的,这意味着你必须以某种方式解决这个问题。

Stuart提出的模式%d*%.?%d*匹配所有十进制数(带或不带点),但它也匹配空字符串,这不是很有用。 %d+%.?%d*匹配点之前至少有一位数的所有十进制数(或没有点),%d*%d.?%d+匹配点后面至少有一位数(或没有点)的所有十进制数。 %.%d+匹配小数点之前没有数字的十进制数字。

一个简单的解决方案是搜索多个这些模式(例如,%d+%.?%d*%.%d+),然后合并结果。然后看看你找到它们的地方,看看它们后面是否有']'。


我使用frontier pattern进行了一些实验。

模式%f[%.%d]%d*%.?%d*%f[^%.%d%]]匹配所有十进制数字,前面是既不是数字也不是点(或什么都不是),后面跟既不是]也不是数字也不是点(或者是没有)。不过,它也匹配单点。

答案 1 :(得分:1)

"%d*%.?%d+"将以十进制格式匹配所有此类数字(请注意,这将遗漏任何已签名的数字,例如-1.1+3.14)。您需要提出另一种解决方案,以避免以]结尾的实例,例如在查找数字之前将其从字符串中删除:

local pattern = "%d*%.?%d+"
local clean = string.gsub(orig ,pattern .. "%]", "")
return string.gmatch(clean, pattern)