【问题标题】:Lua patterns to replace multiple semicolons用于替换多个分号的 Lua 模式
【发布时间】:2013-11-20 01:16:34
【问题描述】:

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

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

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

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

输出必须是这样的:

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

这可以使用单一模式吗?

【问题讨论】:

    标签: string lua lua-patterns


    【解决方案1】:

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

    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)
    

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

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

    【讨论】:

    • 现在我使用tempString:gsub(';+', ';'):gsub(';*$', ''),但我想知道是否存在单一模式方法
    • @AlvaroFuentesZurita 这和我写的一样。使用单一模式是可能的,我添加了一个解决方案,但我更喜欢使用两种模式,因为它更清晰。
    【解决方案2】:

    这样的事情怎么样:

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

    输出:

    一;二;三;四;五;六;七

    【讨论】:

      【解决方案3】:

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

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

      否则,其他答案都可以。

      【讨论】:

        【解决方案4】:

        它有点笨拙,但它确实有效:

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

        【讨论】:

          【解决方案5】:

          (注意:我完全按照你的描述,所以这些将匹配一两个;但不超过两个,最后是零或一;但不超过一个)

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

          【讨论】:

            猜你喜欢
            • 2016-02-15
            • 2014-10-12
            • 2011-04-07
            • 1970-01-01
            • 2014-11-15
            • 1970-01-01
            • 2019-07-26
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多