【问题标题】:Lua string.gsub with Multiple Patterns具有多种模式的 Lua string.gsub
【发布时间】:2014-10-06 11:18:35
【问题描述】:

我正在重命名包含不需要的字母的电影标题。 string.gsub 可以用 "" nil 值替换字符串,但我有大约 200 个字符串模式需要用 "" 替换。

现在我必须string.gsub 为每个模式。我在想有没有办法将所有字符串模式放入单个 string.gsub 行。我在网上搜索了解决方案,但仍然没有得到任何东西。

片名是这样的B.A.Pass 2013 Hindi 720p DvDRip CROPPED AAC x264 RickyKT 我想删除额外的字符,如2013Hindi720pDvDRipCROPPEDAACx264RickyKT

【问题讨论】:

标签: string lua lua-patterns


【解决方案1】:

您可以将表格作为第三个参数传递给string.gsub,如下所示:

local movie = "B.A.Pass 2013 Hindi 720p DvDRip CROPPED AAC x264 RickyKT"
movie = movie:gsub("%S+", {["2013"] = "", ["Hindi"] = "", ["720p"] = "", 
                       ["DvDRip"] = "", ["CROPPED"] = "", ["AAC"] = "", 
                       ["x264"] = "", ["RickyKT"] = ""})

print(movie)

【讨论】:

    【解决方案2】:

    将所有模式放在一个表中,然后枚举该表,为每个模式调用string.gsub()

    str = "B.A.Pass 2013 Hindi 720p DvDRip CROPPED AAC x264 RickyKT"
    
    patterns = {"pattern1", "pattern2", "pattern3"}
    for i,v in ipairs(patterns) do
        str = string.gsub(str, v, "")
    end
    

    这将需要多次调用string.gsub(),但代码应该比调用大量string.gsub() 更易于维护。

    【讨论】:

    • 一个可能的问题是,像"722013p" 这样的子字符串将被"2013" 匹配,留下"720p",然后被"720p" 匹配,这不是预期的。
    【解决方案3】:

    你可以用一个简单的函数来完成,这样你就不需要每次为每个字符串编写代码,或者只需输入string.gsub,以及你需要的字符串的替换值

    功能:

    local large_name = "B.A.Pass 2013 Hindi 720p DvDRip CROPPED AAC x264 RickyKT"
    
    function clean_name(str)
      local v = string.gsub(str, "(.-)%s([%(%[']?%d%d%d?%d?[%)%]]?)%s*(.*)", "%1")
      return v
    end
    
    print(clean_name(large_name))
    

    只有 string.gsub 的值

    local large_name = "B.A.Pass 2013 Hindi 720p DvDRip CROPPED AAC x264 RickyKT"
    local clean_name = string.gsub(large_name, "(.-)%s([%(%[']?%d%d%d?%d?[%)%]]?)%s*(.*)", "%1")
    
    print(clean_name)
    

    替换模式将第一个值(电影名称)以空格分隔并打印出来,同时将年份标识为第二个值,以避免标题错误,因此不必放置所有值​​可以存在于电影名称中,并且会避免很多误报

    我添加了一个测试函数来测试不同的电影名称

    local testing = {"Whiplash 2014 [1080p]",
    "Anon (2018) [WEBRip] [1080p] [YTS.AM]",
    "Maze Runner The Death Cure 2018 [WEBRip] [1080p] [YTS.AM]",
    "12 Strong [2018] [WEBRip] [1080p] [YTS.AM]",
    "Kingsman The Secret Service (2014) [1080p]",
    "The Equalizer [2014] [1080p]",
    "Annihilation 2018 [WEBRip] [1080p] [YTS.AM]",
    "The Shawshank Redemption '94",
    "Assassin's Creed 2016 HC 720p HDRip 850 MB - iExTV",
    "Captain Marvel (2019) [WEBRip] [1080p] [YTS.AM]",}
    
    for k,v in pairs(testing) do
      local result = string.gsub(v, "(.-)%s([%(%[']?%d%d%d?%d?[%)%]]?)%s*(.*)", "%1")
      print(result)
    end
    

    输出:

    Whiplash
    Anon
    Maze Runner The Death Cure
    12 Strong
    Kingsman The Secret Service
    The Equalizer
    Annihilation
    The Shawshank Redemption
    Assassin's Creed
    Captain Marvel
    

    【讨论】:

      【解决方案4】:

      为了避免为每个新条目在表上写入键和值,我会编写一个函数来处理数字索引表(模式是值)。

      这样我就不需要为每个新模式写{["pattern_n"] = ""}

      例如:

      PATTERNS = {"2013", "Hindi", "720p", "DvDRip", "CROPPED", "AAC", "x264", "RickyKT"}
      function replace(match)
          local ret = nil
          for i, v in ipairs(PATTERNS) do
              if v:find(match) then
                  ret = ""
              end
          end
          return ret
      end
      
      
      local movie = "B.A.Pass 2013 Hindi 720p DvDRip CROPPED AAC x264 RickyKT"
      movie = movie:gsub("%S+", replace)
      
      print(movie)
      

      【讨论】:

        猜你喜欢
        • 2014-11-15
        • 2016-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-13
        • 1970-01-01
        相关资源
        最近更新 更多