Lua 语言中字符串可以使用以下三种方式来表示:
单引号间的一串字符。
双引号间的一串字符。
[[和]]间的一串字符。
Lua中连接字符串使用..
Lua 提供了很多的方法来支持字符串的操作:
string.upper(argument):
字符串全部转为大写字母。
string.lower(argument):
字符串全部转为小写字母。
string.sub(s,i,j)
函数截取字符串s的从第i个字符到第j个字符之间的串。Lua中,字符串的第一个字符索引从1开始。你也可以使用负索引,负索引从字符串的结尾向前计数:-1指向最后一个字符,-2指向倒数第二个,以此类推。
string.len(“222”)
获取字符串长度。
string.char将整型数字转成字符并连接
string.char(97,98,99,100)
abcd
string.byte转换字符为整数值(可以指定某个字符,默认第一个字符)。
string.byte(“ABCD”,4)
68
string.byte(“ABCD”)
65
string.rep(string, n))返回字符串string的n个拷贝
string.rep(“abcd”,2)
abcdabcd
string.reverse(arg)字符串反转
string.reverse(“Lua”)
auL

lua string库里最强大的函数是那些模式匹配函数:find, match, gsub, gmatch。和其他脚本语言不同,lua既没有用POSIX的正则表达式,也没有用perl的正则表达式。原因是实现这些导致lua占用更多内存,而lua的初衷是小巧的,嵌入应用的语言。 lua用少于500行的代码实现了自己的一套模式匹配,虽然不如标准的正则表达式强(一般需要4000以上代码),但也足够强大。
Lua支持的匹配模式:
. 任意字符
%s 空白符
%p 标点
%c 控制字符
%d 数字
%x 十六进制数
%z 代表0的字符
%a 字母
%l 小写字母
%u 大写字母
%w 字母数字
字符类的大写形式代表相应集合的补集, 比如 %A 表示除了字母以外的字符集
另外,* + – 三个,作为通配符分别表示:
*: 匹配前面指定的 0 或多个同类字符, 尽可能匹配更长的符合条件的字串,也就是正则中的贪婪匹配。
+: 匹配前面指定的 1 或多个同类字符, 尽可能匹配更长的符合条件的字串
-: 匹配前面指定的 0 或多个同类字符, 尽可能匹配更短的符合条件的字串,也就是正则中的非贪婪匹配。
用%进行转义。’%%’代表’%’

string.find
print(string.find(“haha”, ‘ah’) ) —– 输出 2 3
注意: lua 里面数组或者字符串的字符, 其下标索引是从 1 开始, 不是 0
string.find 默认情况下返回两个值, 即查找到的子串的 起止下标, 如果不存在匹配返回 nil。
如果我们只想要 string.find 返回的第二个值, 可以使用 虚变量(即 下划线)
_, q=string.find(“haha”, ‘ah’)
print(q) —– 输出 3
另外在WAF中匹配上传文件的名字时用到:
start_pos,end_pos,capture,capture2 = string.find(v,’Content%-Disposition: form%-data; name=”(.+)”; filename=”(.*)”\r\n’)
因为-表示的是非贪婪匹配,所以都需要用%-转义。另外用小括号括起来表示捕捉匹配到的字符串。这里捕捉了两次,所以多返回了两个值。

Lua中实现分割字符串的函数:

local function explode ( _str,seperator )  
    local pos, arr = 0, {}  
        for st, sp in function() return string.find( _str, seperator, pos, true ) end do  
            table.insert( arr, string.sub( _str, pos, st-1 ) )  
            pos = sp + 1  
        end  
    table.insert( arr, string.sub( _str, pos ) )  
    return arr  
end

string.match
string.match和string.find类似。都是在指定的string中

date = "now is 2014/10/6 17:58"
d = string.match(date, "%d+/%d+/%d+")
print(d)
输出2014/10/6
a,b = string.match("hello+world","(%a*)%+(%a*)")
print(a.."--->"..b) 
输出hello--->world

string.gmatch
将返回一个迭代器,用于迭代所有出现在给定字符串中的匹配字符串。
例如WAF中获取文件扩展名的函数写法如下:

function split_string(filename)--获取上传文件扩展名
    local _t = {}
    for w in string.gmatch(filename,"([^'.']+)") do     --按照.分割字符串
        table.insert(_t,w) 
    end
    local length = table.getn(_t)
    return _t[length]--返回table的最后一个元素
end
print(split_string("image.jpg.php"))

输出php

string.gsub(字符串,匹配模式,替代字符串,替换次数为空代表全部替换)
将所有符合匹配模式的地方都替换成替代字符串。并返回替换后的字符串,以及替换次数。

s,c = string.gsub("Lua is cute", "%s", "|")
print(s.." count:"..c) --> Lua|is|cute count:2
s,c = string.gsub("Lua is cute", "%s", "|",1)
print(s) --> Lua|is cute