【问题标题】:Lua gsub regex to replace multiple occurances of charactersLua gsub 正则表达式替换多次出现的字符
【发布时间】:2017-07-15 06:30:16
【问题描述】:

我正在尝试通过删除多次出现的特定字符来修改我的 URL 以使其简洁友好

local function fix_url(str)
return str:gsub("[+/=]", {["+"] = "+", ["/"] = "/", ["="] = "="}) --Needs some regex to remove multiple occurances of characters
end
url = "///index.php????page====about&&&lol===you"
output = fix_url(url)

我想实现这样的输出:

"/index.php?page=about&lol=you"

但我的输出是这样的:

"///index.php????page====about&&&lol===you"

gsub 是我应该这样做的方式吗?

【问题讨论】:

  • url = url:gsub("([+/=&?])%1", "\0%0"):gsub("(.)%z%1", ""):gsub("%z(.)%1%1", "%1"):gsub("%z.", "")

标签: lua


【解决方案1】:

我不知道如何通过拨打gsub 来做到这一点。下面的代码通过为每个字符调用一次gsub 来实现这一点:

url = "///index.php????page====about&&&lol===you"

function fix_url(s,C)
    for c in C:gmatch(".") do
        s=s:gsub(c.."+",c)
    end
    return s
end

print(fix_url(url,"+/=&?"))

【讨论】:

  • 感谢它运行良好,并且超级容易实现,并且可以根据我的需要添加更多字符。
  • 您只需要小心某些字符。例如,不能使用点,因为它将匹配所有内容 (.+)。您应该转义所有标点符号。我会这样写:function fix_url(s,C) local m for c in C:gmatch('.') do m = c if m:match '%W' then m = '%'..m end s = s:gsub(m..'+',c) end return s end
【解决方案2】:

这是一种可能的解决方案(将 %p 替换为您喜欢的任何字符类):

local
function fold(s)
  local ans = ''
  for s in s:gmatch '.' do
    if s ~= ans:sub(-1) then ans = ans .. s end
  end
  return ans
end

local
function fix_url(s)
  return s:gsub('%p+',fold) --remove multiple same characters
end

url = '///index.php????page====about&&&lol===you'
output = fix_url(url)

print(output)

【讨论】:

  • 太棒了,谢谢 :) 提供的两种解决方案都非常有效,但我将以上内容标记为答案,因为它更容易用于我需要的内容
猜你喜欢
  • 2015-11-30
  • 1970-01-01
  • 2013-12-09
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
相关资源
最近更新 更多