我需要解析可能在组内部有内部组的逗号分隔组(括在括号中)。它应该只将外部群体分开。
我有一个执行此操作的功能:
function lpeg.commaSplit(arg)
local P,C,V,sep = lpeg.P, lpeg.C, lpeg.V, lpeg.P(",")
local p = P{
"S";
S = lpeg.T_WSpace * C(V"Element") * (lpeg.T_WSpace * sep * lpeg.T_WSpace * C(V"Element"))^0 * lpeg.T_WSpace,
Element = (V"Group")^0 * (1 - lpeg.T_Group - sep)^0 * (V"Group" * (1 - lpeg.T_Group - sep)^0)^0 * (1 - sep)^0,
Group = lpeg.T_LGroup * ((1 - lpeg.T_Group) + V"Group")^0 * lpeg.T_RGroup
}^-1
return lpeg.match(lpeg.Ct(p), arg)
end
但问题是要删除可能包含该组的额外括号。
这是一个测试字符串:
[[a,b,[c,d]],[e,[f,g]]]
应解析
[a,b,[c,d] & [e,[f,g]]
请注意,内部组保持不变。简单地删除末端的额外括号不起作用,因为您最终会得到a,b,[c,d]],[e,[f,g]
之类的字符串。
如何修改lpeg语法以允许外部组?
答案 0 :(得分:3)
由于我不是在LPeg中制作语法的专家,我觉得这个练习很有意思......
我无法使用你的语法,所以我继续自己创造,更小的块更容易理解,我可以把我需要的捕获物放在哪里。
我认为我得到了一个不错的实证结果。它适用于您的测试用例,我不知道组是否可以更深层次嵌套等等。捕获的后处理有点特别......
require"lpeg"
-- Guesswork...
lpeg.T_WSpace = lpeg.P" "^0
lpeg.T_LGroup = lpeg.P"["
lpeg.T_RGroup = lpeg.P"]"
lpeg.T_Group = lpeg.S"[]"
function lpeg.commaSplit(arg)
local P, C, Ct, V, sep = lpeg.P, lpeg.C, lpeg.Ct, lpeg.V, lpeg.P","
local grammar =
{
"S";
S = lpeg.T_WSpace * V"Group" * lpeg.T_WSpace,
Group = Ct(lpeg.T_LGroup * C(V"Units") * lpeg.T_RGroup),
Units = V"Unit" *
(lpeg.T_WSpace * sep * lpeg.T_WSpace * V"Unit")^0,
Unit = V"Element" + V"Group",
Element = (1 - sep - lpeg.T_Group)^1,
}
return lpeg.match(Ct(P(grammar)^-1), arg)
end
local test = "[[a,b,[c,d]],[e,[f,g]]]"
local res = lpeg.commaSplit(test)
print(dumpObject(res))
print(res[1], res[1][1], res[1][2])
local groups = res[1]
local finalResult = {}
for n, v in ipairs(groups) do
if type(v) == 'table' then
finalResult[#finalResult+1] = "[" .. v[1] .. "]"
end
end
print(dumpObject(finalResult))
dumpObject只是我自己的表转储。此代码的输出如下:
local T =
{
{
"[a,b,[c,d]],[e,[f,g]]",
{
"a,b,[c,d]",
{
"c,d"
}
},
{
"e,[f,g]",
{
"f,g"
}
}
}
}
table: 0037ED48 [a,b,[c,d]],[e,[f,g]] table: 0037ED70
local T =
{
"[a,b,[c,d]]",
"[e,[f,g]]"
}
就个人而言,我不会用我的东西污染lpeg表,但我保留了你的风格。
我希望这会有用(或者会成为让你前进的起点)。