string.sub(s,i[,j]) 返回一项字符串的一部分 s为目标字符串 i为起始位置 j为终止位置,可不填,默认为-1,即使字串结束 i,j都可为负数s = "我们是快乐的人啊!23333" local x = string.sub(s,1,-6) --> x="我们是快乐的人啊!"
重点介绍,最常用的 string.gsub(s,pattern,repl[,n]) 返回因符合规则被全部或替换n次后的字符串,同时返回匹配成功次数 s为目标字符串 pattern为规则 repl为替换字符串,可为string,function,table。如果为string,则%在这里作为一个特殊符号,任何%1到%9代表会第几次的返回值(这个返回值是一次匹配成功值下面会介绍),%1就是第一个值,%9则是第九个。而%0则是全部。而%%则表示百分比字符。如果repl是function,每次匹配成功将会调用函数,会将匹配到的字符串变为参数,如果没有指定规则,则将整个字符串传为一个参数。如果rep是table,则每次匹配成功都会与table进行比对,如符合array则替换为key值,如没有规则,则以整个字符串作为比对。注:如果function和table的返回值是string或者数字,那么则替换,如果返回false或者nil则不进行替换。 n为执行几次替换
s="先来最基础简单的" x = string.gsub(s,"基础简单","复杂困难") --将"基础简单"替换成"复杂困难" --> x = "先来最复杂困难的" s="多次替换数字123,多次替换数字321" x = string.gsub(s,"%d+","lalala") --将数字替换成"lalala" --> x = "多次替换数字lalala,多次替换数字lalala" s="本末&倒置,开始=逆转" x = string.gsub(s,"(.+)&(.+),(.+)=(.+)","%3%2%4%1") --一次匹配下返回括号内四个值,并且排列后替换整个字符串 --> x = "开始倒置逆转本末" %1-%4相当于临时变量,将临时变量赋予括号内的值并且将整个字符串替换成临时排列后的变量。 %1 = 本末,%2 = 倒置,%3=开始,%4=逆转,而%0则是等于整个字符串:本末&倒置,开始=逆转 s="hello string test world" x = string.gsub(s,"(%w+)%s*(%w+)","%1",1) --一次匹配返回两个值,将这两个替换成第一个值,只执行一次 --> x = "hello test world" 由于(%w+)%s*(%w+) 是匹配两个单词为一对,那么在例子里面符合条件的有两对,一个是hello string以及test world。首先匹配到hello string返回两个值%1=hello,%2=string,然后将整个hello string替换成hello。而由于值执行一次,所以第二对匹配成功的则不进行替换 s="hello string test world" x = string.gsub(s,"(%w+)%s*(%w+)","%0 %0",1) --匹配成功后将多复制一次,只执行一次 --> x = "hello string hello string test world" 匹配成功的是hello string,两个%0代表这个hello string会出现两次,也就是这个结果了 x = string.gsub("2+6 = $return 2+6[ DISCUZ_CODE_20 ]quot;, "%$(.-)%[ DISCUZ_CODE_20 ]quot;, --匹配两个$内的内容,即return 2+6 function (s) return loadstring(s)() --同loadstring("return 2+6")(),简单来说就是return 8,返回8并且将包含两个$的字符串替换掉 end) --> x="2+6 = 8" 如果是单独写的函数则直接调用即可,例: function a(s) return loadstring(s)() end x = string.gsub("2+6 = $return 2+6[ DISCUZ_CODE_21 ]quot;, "%$(.-)%[ DISCUZ_CODE_21 ]quot;,a) --> x = "2+6 = 8"
local t = {name="lua", version="5.1"} x = string.gsub("$name-$version.tar.gz", "%$(%w+)", t) --匹配table内的项目并且替换掉原有的 --> x="lua-5.1.tar.gz"
说了这么半天,正则主要是看怎么定下规则,其他的应用都听简单的,至于规则的熟悉则要多练习,多实验才能体会到。
|