这个正则表达式在Lua中怎么写?

问题描述 投票:0回答:2

我需要编写与以下正则表达式(regex)等效的Lua

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

与 Lua 的

string.gmatch
一起使用。这可以吗?

作为参考,上述表达式匹配包含小数分隔符的数字的整数部分和小数部分(例如 1、1.1、0.1、0.11 均完全匹配)。但是,如果存在尾随

]
,则仅匹配整数部分(例如,
1.
中仅匹配
1.1]
)。

regex lua pattern-matching
2个回答
18
投票

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

Lua 拥有的是匹配模式,它的功能要弱得多(但对于许多用例来说仍然足够了):

  • 没有“单词边界”匹配器,
  • 别无选择,
  • 也没有前瞻或类似的。

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

Stuart 提出的模式

%d*%.?%d*
,匹配所有十进制数字(带点或不带点),但它也匹配空字符串,这不太有用。
%d+%.?%d*
匹配点前至少一位数字(或不带点)的所有十进制数,
%d*%d.?%d+
匹配点后至少一位数字(或不带点)的所有十进制数。
%.%d+
匹配点前没有数字的十进制数字。

一个简单的解决方案是搜索多个模式(例如,

%d+%.?%d*
%.%d+
),然后合并结果。然后看看你找到它们的地方,看看它们后面是否有一个“]”。


我尝试了一些前沿模式

模式

%f[%.%d]%d*%.?%d*%f[^%.%d%]]
匹配所有十进制数字,这些数字前面既不是数字也不是点(或什么都没有),后跟既不是
]
也不是数字也不是点(或什么都没有)的东西。不过,它也与单个点匹配。


2
投票

"%d*%.?%d+"
将匹配十进制格式的所有此类数字(请注意,这会丢失任何有符号数字,例如
-1.1
+3.14
)。您需要想出另一种解决方案来避免以
]
结尾的情况,例如在查找数字之前将它们从字符串中删除:

local pattern = "%d*%.?%d+"
local clean = string.gsub(orig ,pattern .. "%]", "")
return string.gmatch(clean, pattern)
© www.soinside.com 2019 - 2024. All rights reserved.