2

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

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

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

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

输出必须是这样的:

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

这可能使用单一模式吗?

4

5 回答 5

3

使用一种模式将 multiple 替换;为 single ;,然后使用另一种模式删除最后一个;是这样的

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-08T05:25:15.357 回答
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, ";"))

输出:

一二三四五六七

于 2013-11-08T08:09:26.203 回答
0

如果分号的数量是 1 或 2,你可以简单地做

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

否则,其他答案就可以了。

于 2013-11-08T08:52:44.663 回答
0

它有点hacky,但它可以解决问题:

x = test:gsub(";+(.?)",
  function(a)
    if a == "" then
      return ""
    else
      return ";" .. a
    end
  end)
于 2013-11-08T20:44:54.090 回答
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)
于 2015-03-31T20:29:13.703 回答