我在Lua脚本中得到了这个字符串:
one;two;;three;four;;five;;six;seven;
第一个字母永远不会是分号。中间分隔符可以是单个分号或双分号,最后一个分号可以是或不是单个分号。
使用Lua模式(和string.gsub()
):如何匹配中间的双分号以替换单个分号并删除最后一个可选分号?
输出必须如下:
one;two;three;four;five;six;seven
这可以使用单一模式吗?
答案 0 :(得分:3)
使用一种模式将多个;
替换为单;
,将另一种模式替换为最后一个;
,就像这样
local str = "one;two;;three;four;;five;;six;seven;"
local result = str:gsub(';+', ';'):gsub(';*$', '')
使用单一模式的一种可能方法是:
local result = (str .. ";;;"):gsub(";+", function(s)
if s == ";" or s == ";;" then
return ";"
else
return ""
end
end)
我要做的是将三个;
附加到字符串的末尾,因此任何一个或两个;
应该替换为一个;
。更多;
(可能是三个或四个,它必须在最后)被替换为空字符串。
我更喜欢有两种模式的解决方案,因为它更清晰。
答案 1 :(得分:1)
这样的事情怎么样:
function remove_extra_delim(s, delim)
local t = {}
for each in s:gmatch("[^"..delim.."]+") do
table.insert(t, each)
end
return table.concat(t, delim)
end
teststr = "one;two;;three;four;;five;;six;seven;"
print(remove_extra_delim(teststr, ";"))
输出:
一个;二;三;四;五;六; 7
答案 2 :(得分:0)
如果分号的数量是1或2,您只需执行
即可string:gsub(";;", ";")
否则,其他答案都可以。
答案 3 :(得分:0)
它有点hacky,但它有把戏:
x = test:gsub(";+(.?)",
function(a)
if a == "" then
return ""
else
return ";" .. a
end
end)
答案 4 :(得分:0)
(注意:我完全按照你的描述,所以这些将匹配一个或两个;但不超过两个,最后的零或一个;但不超过一个)
-- Method one uses two patterns but it's simpler and my preferred one
s = 'one;two;;three;four;;five;;six;seven;'
s = s:gsub(';;',';'):gsub(';?$','')
print(s)
-- Method two uses one pattern (if you really MUST use only one pattern)
s = 'one;two;;three;four;;five;;six;seven;'
s = (s..';'):gsub(';;',';')
s = s:sub(1,#s-1)
print(s)