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

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

第一个字符永远不会是半圆环。中间分离器可以是单个或双分号,最后一个char可以是也不是单个半分号。

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

输出必须像这样:

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

这可以使用单个模式吗?

有帮助吗?

解决方案

使用一种模式替换多个 ; 单一 ;, ,另一个要删除最后一个 ; 就是这样

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)

我要做的是附加三个 ; 到弦的末端,所以任何一个或两个 ; 应该用一个 ;. 。和更多 ;(可能是三,四个,必须在末尾)替换为空字符串。

我更喜欢使用两种模式的解决方案,因为更清楚。

其他提示

这样的事情怎么样:

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

输出:

一二三四五六七

如果半隆的量为1或2,则可以简单地做

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

否则,其他答案将做到。

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

x = test:gsub(";+(.?)",
  function(a)
    if a == "" then
      return ""
    else
      return ";" .. a
    end
  end)

(注意:我正在准确地遵循您的描述,因此这些描述将匹配一个或两个;但不超过两个,最终的零或一个;但不超过一个)

-- 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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top