对于lua 魔法字符以及string,gsub和(+-*)问题的理解

--*********当取(.-)时,一开始先匹配一个[,0个或多个=号,一个[,尽可能少的内容直到遇到'第'一个]
--*********0个或多个=号,一个],停止匹配*************--
p = "%[(=*)%[(.-)%]%1%]"
s = "a = [=[[[ something ]] ]=] ]=];print(a)"
print(string.match(s,p))

print(string.gsub(s,"%[(=*)%[(.-)%]%1%]","%1"))


--*********当取(.-)时,一开始先匹配一个[,0个或多个=号,一个[,尽可能少的内容直到遇到'最后'一个]
--*********0个或多个=号,一个],停止匹配*************--
p = "%[(=*)%[(.-)%]%1%]"
s = "a = [=[[[ something ]] ]=] ]=];print(a)"
print(string.match(s,p))
print(string.gsub(s,"%[(=*)%[(.+)%]%1%]","%1"))


--**************模式中有两个()(),所以,替换的子串:%1表示捕获的第一个内容,%2表示捕获的第二个内容*********--
s = string.gsub([[the \quote{task} is to \em{change} that]],"\\(%a+){(.-)}","<%1>%2</%1>");--两个括号所以又两次内容“%1”表示第一个捕获
到的子窜,匹配模式里要用()括起来才算是捕获到的内容。(quote)第一个子窜,(change)第二个子窜
print(s);
 


--******************[^%s*(.-)%s*$]表示这个模式的补集,^%s*(.-)%s*$表示以‘空格为开头,任意内容,以空格结尾’
s = "  hello from lua,i come from china  kk \n jjj"
function trim(s)
    return string.gsub(s,"^%s*(.-)%s*$","%1=");--括号里面捕获到第一次内容
end
print(trim(s))


--*****************对字符串表模式的理解******************--
function expand(s)
    s = string.gsub(s, "%$(%w+)",function(n)
        return _G[n];
    end);
    return s;
end

name = "Lua"; status = "great";
print(expand("$name is $status, isn't it?"));


--*********************捕获模式中对括号的理解************--
function toxml (s)
    s = string.gsub(s,"\\(%a+)(%b{})",function(tag,body)--两个括号,表示捕获到两个参数,传给function
    print("0",tag,body)
    body = string.sub(body,2,-2)
    print("1",body)
    body = toxml(body)
    print("2",body)
    return string.format("<%s>%s</%s>",tag,body,tag)
    end
    )
  return s
  end
  m=[[\title{The \bold{big} example}]]
  print(toxml(m))
 


--*************URL的译码与解码******************--
function escape(s)
    s = string.gsub(s,"([&=+%c])",function(c)
        return string.format("%%%02X",string.byte(c))
        end)
    s = string.gsub(s, " ","+");
    return s;
end

function encode(t)
    local s = "";
    for k,v in pairs(t) do
        s = s.."&"..escape(k).."="..escape(v);
    end
    return string.sub(s,2);
end

t = {name = "a1",query = "a+b = c",q = "yes or no"};
print(encode(t));


--********字符串的双引号中包含转义的引号,如何处理****************--
m = [[follow a typical:"This is \"great\"!"]]
function code(s)
   return (string.gsub(s,"\\(.)",function(x)
     return string.format("\\%03d",string.byte(x))
     end))
end

function decode (s)
  return (string.gsub(s,"\\(%d%d%d)",function(d)
         return "\\"..string.char(d)
  end))
end
print(code(m))
kk = code(m)

  1. print(decode(kk))
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值