Lua模式用于替换多个分号

我在 Lua 脚本中得到了这个字符串:

one;two;;three;four;;five;;six;seven;

第一个字符永远不会是分号。中间的分隔符可以是单个或双个分号,而最后一个字符可以是单个分号或没有分号。

使用 Lua 模式(和 string.gsub()):如何匹配中间的双分号以将其替换为单个分号并删除最后一个可选分号?

输出必须像这样:

one;two;three;four;five;six;seven

能否使用单个模式实现?

点赞
用户1009479
用户1009479

使用一个模式将多个 ; 替换成一个 ;,另一个模式将最后一个 ; 移除,代码如下:

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)

我想做的是在字符串末尾添加三个 ;,因此任何一个或两个 ; 都应该被替换为一个 ;。并且更多的 ;(可能是三个或四个,必须在末尾)被替换为空字符串。

我更喜欢使用两个模式的解决方案,因为它更清晰。

2013-11-08 05:25:15
用户234175
用户234175

如何使用如下函数:

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, ";"))

输出结果:

one;two;three;four;five;six;seven

2013-11-08 08:09:26
用户1009655
用户1009655

如果分号的数量为1或2,你可以简单地执行以下操作:

string:gsub(";;", ";")

否则,其他答案将会有效。

2013-11-08 08:52:44
用户2895784
用户2895784

这个方法有点 hacky,但它能达到目的:

x = test:gsub(";+(.?)",
  function(a)
    if a == "" then
      return ""
    else
      return ";" .. a
    end
  end)
2013-11-08 20:44:54
用户3735873
用户3735873
-- 方法一使用两个模式,但更简单,也是我首选的方法
s = 'one;two;;three;four;;five;;six;seven;'
s = s:gsub(';;',';'):gsub(';?$','')
print(s)

-- 方法二只使用一个模式(如果你确实必须只使用一个模式)
s = 'one;two;;three;four;;five;;six;seven;'
s = (s..';'):gsub(';;',';')
s = s:sub(1,#s-1)
print(s)
2015-03-31 20:29:13