我试图将这个regex模式转换为lpeg:{ *(?<!-)[, ](?!-) *} --它将作为拆分模式使用,将2.5 2.6/2.5, 2.6转换为2.5和2.6,除非涉及到-。这是标识语义约束的一部分。
我使用了从lpeg 文档复制的拆分函数
local function split (str, sep)
sep = l.P(sep)
local elem = l.C((1 - sep)^0)
local p = l.Ct(elem * (sep * elem)^0) -- make a table capture
return p:match(str)
end我的第一次尝试是在有逗号的情况下:
local h, sp = l.P'-', l.P' '
patt = sp^0 * (-h * l.S' ,' - h) * sp^0
split('2.5, 2.6', patt) -- works
split('2.5 2.6', patt) -- fails because the first sp^0 eats everything然而,当只有空格时,它当然会失败。我不知道如何维护原始regex模式的约束,并使其在这两种情况下都能工作。我的其他努力以无限循环结束。是否有一种方法来捕获模式的一个实例,它被贪婪的自身版本所包围,或者lpeg的一些聪明的方面可以解决这个问题?
发布于 2022-09-01 02:15:38
LPeg中默认的匹配方法是盲贪婪匹配,为了模拟给定正则表达式的行为,我们需要构造一个非盲贪婪匹配文法,
S <- E1 S/ E2
它将匹配多个E1和E2。
local patt = l.P{
's',
s = ' ' * l.V's' + l.V'suffix',
suffix = -l.B'-' * l.S', ' * -l.P'-' * l.P' '^0
}https://stackoverflow.com/questions/73347751
复制相似问题