一,字符类基础函数举例介绍:
string.len( ‘string’ )
string.lower( ‘string’ )
string.upper( ‘string’ )
string.rep( ‘a’ , 5 ) ==> aaaaa
string.sub( ‘string’ , I , j )
string.sub( s, string.find(s, 'world') )
string.sub函数会提取子串by子串所在字符串的位置下标
string.char() string.byte()
string.format( ‘%02d:%02d:%02d’ , d , m , y )
二,模式匹配(pattern-matching)函数举例介绍:字符串=>被查找的字符串;子串=>要查找的字符(串):
string.find( 'string', 'substr' ) 返回 子串的前后位置
string.find( 'string', 'c' ) 返回相同位置
由此,find函数简单查找子串(包含字符) 返回值是2个值;没有找到,即返回nil。
string.find( s, 'substr', index ) 该函数的第三个参数是开始查找下标
string.match()函数返回匹配到的子串的一份copy。
string.match( 'string' , '%d+/%d+%d+') -->12/23/34
string.gsub( 'Lua is cute', 'cute', 'great' ) -->Lua is great
用第三个参数替换第一个参数中所有出现的第二个参数,并返回整串以及发生的实际替换次数。
string.gsub( 'all lla' , 'l' , 'x' , 3 ) -->axx xla 第四个参数限制替换的次数
string.gmatch(s, '%a') 将返回一个函数,遍历到所有的模式指定子串by返回的函数。
words = {}
for w in string.gmatch( s, "%a+" ) do
words[#words+1] = w
end
总结一下:各模式匹配函数的基本简单功能
find( 'string' , 'strsub' , index ) 从起始位置(index)查找子串返回位置
match( 'string' , '%s%d.....' ) 匹配捕获,返回子串的copy
gmatch( 'string', '%s%d' ) 全局匹配捕获,返回一个函数提供所有子串
gsub( 'string' , 'go' , 'come' , count) 替换字符串中所有go子串换count次
其实,差不多是根据函数返回值不同,则大约功能相差一些,参数排布相似,并且都是遍历查找功能。那么上面大致的三类就引领了模式匹配3个大的功能方面:查找,捕获,替换。
三,模式们(基础元素) 模式就是一种字符串,模式函数会解释它们,它们就有了意义
字符分类:(字符,即一个)分类字符们的大写表示相对补集
%d(数字)%a(字母)%c(控制字符)%l(小写字母)
%p(标点)%s(空白字符)%u(大写字母)
%w( a | d )%x(十六进制数字)
特殊字符们: ( ) . % + - * ? [ ] ^ $
普通字符串,用来转义: ‘\n’
模式函数解释模式串: 模式中的 特殊字符们需要使用原字符意义用%转义。
但是,尝试了一下这种情况: string.find( s , ‘^[+-]?%d+$’ ) 依然能够匹配出字符串前面的+-号,当然string.find( s , ‘[%+%-]?%d+’ )也能够匹配出结果。所以,建议使用后者,含义比较清晰。
字符集: [%w_] [AEIOUaeiou] [0-9A-Fa-f] [^\n] [^%s] %S
描述模式的重复和可选:
+ 重复1次以上
*- 重复随便几次
? 0次,1次
四,捕获 “( )”
函数string.match会将所有捕获到的值返回
date = “Today is 12/12/2012”
d , m , y = string.match( date, “(%d+)/(%d+)/(%d+)”)
%d 用来匹配与前面第d个捕获相同内容,不仅是字符个数相同。
q,quotedPart = string.match( s , “([\”’])(.-)%1”) à%1的地方必须要与前面([\”’])相同的内容来填补%1此位置。
s = string.gsub(s , “\\(%a+){(.-)}” , “<%1><%2><\%1>” )
%d此展位捕获前面位置内容的项,也可以用在替换函数中。
function trim ( s )
return ( string.gsub( s , “^%s*(.-)%s*$” , “%1” ) )
end
五,替换
string.gsub 函数的第三个参数不仅是替换的字符串,还可以是一个table , 或者是一个函数。
table: gsub每次找到匹配字符串时,以此字符串作为key,用table中对应的value来替换,没有对应value,不替换。
string.gsub( s , “$(%w+)” , _G ) à _G是全局变量的table
function: gsub每次找到匹配字符串时,调用该函数并将匹配字符串作为参数传入。
string.gsub( s , “$(%w+)” , function(n)
return tostring( _G[n] )
end )
一个小的代码演示:
local login_string = "abcdeAAAAAA=4543578,SSSSS=qx564201,fcm=0,timestamp=1381311260,idc=U,origin=,c=0,sign=0d0cc04dd64b4c2e2d9d8102834b45d6"
local kvtable = { } --定义一个用来保存上面字符串的K,V的table.
local login_string_std = string.sub(login_string , 6) --取得AAA.....开始的后面全部字符串
for k,v in string.gmatch(login_string_std , "(%a+)=(%w*)") do --注意到了吗origin木有值
kvtable[k] = v --逐个记录
end
六,URL编码 tab扩展 以及一些技巧
随后,若有时间,再总结。。。
************pairs 与 ipairs***************
在遍历table的时候的区别:
首先,说明一下,数组table(array)就是key 为连续数字的table.
那么,简而言之,ipairs 是遍历数组的;pairs是遍历table(k,v)的
所以用pairs来遍历table(k,v),将会逐个遍历出来,而遍历table(array)也会全部遍历出来,最后返回nil。。。用ipairs来遍历table(k,v),将会停止在第一个非数字key的地方或者停止在得到的value是nil的地方,而遍历table(array)就顺利全部遍历出来了,返回0。
最后,使用ipairs比较严格,使用pairs比较宽松。