Lua模式替换多个分号

时间:2013-11-08 05:19:04

标签: string lua lua-patterns

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

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

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

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

输出必须如下:

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

这可以使用单一模式吗?

5 个答案:

答案 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)