兩大特色:安全
1. string庫中全部的字符索引從前日後是1,2,...;從後往前是-1,-2,...ide
2. string庫中全部的function都不會直接操做字符串,而是返回一個新的字符串。函數
庫函數:編碼
一、string.len,string.rep,string.upper,string.lower,string.sub,string.formatlua
local str = "abc"spa
print(string.len(str)) --6code
print(string.rep(str, 2^2)) --abcabcabcabcorm
print(string.upper(str)) --ABCblog
print(string.lower("ABC")) --abc索引
print(string.format("%02d/%02d/%04d", 5, 12, 2001))--05/12/2001
print(string.sub(str, 1, 2))--ab
截取字符串str的從第i個字符到第j個字符之間的串。
lua中,字符串的第一個字符索引從1開始,你也能夠使用負值,不提供第三個參數,則默認爲-1,
二、string.char,string.byte
string.byte (s [, i [, j] ])函數返回字符s[i], s[i+1], ···, s[j]
的內部數字編碼(ASCII碼),其
中參數i
的默認值是1,而參數j
的默認值是i
。須要注意的是該函數在返回的數字編碼在跨平臺方面不必定是可移植的。
local i=97
print(string.char(i))--a
print(string.char(i, i+1, i+2))--abc
print(string.byte("abc"))--97
print(string.byte("abc", 2))--98
print(string.byte("abc", -1))--99
print(string.byte('abc', 1, 3))--97 98 99
string.char函數和string.byte函數用來處理字符和數字之間轉換。
string.char獲取0個或多個整數,將每個數字轉換成字符,而後返回一個全部這些字符鏈接起來的字符串。
string.byte(s,i)將字符串s的第i個字符的轉換成整數,第二個參數可選,默認爲1。
三、string.find, string.match
在目標串內搜索匹配指定的模式串。若是找到則返回對應的位置,不然返回nil。
local str = "hello world"
local i, j = string.find(str, "hello")
print(i, j) -- 1 5
print(string.find(str, "lll"))--nil
string.find( )的第三個參數是可選的:標示目標串中搜索的起始位置。
查找目標串中某單次出現的次數:
local str = "hello Maria! hello Mical! hello Sam!"
local sum = 0
local idx = 0
repeat
idx = string.find(str, "hello", idx+1)
if idx then
sum = sum + 1
end
until idx == nil
print("sum: ", sum) -- 3
--string.match和string.find相似,都是在指定的string中查找相應的模式。不一樣的是,他返回的是找到的那部分string
四、string.gsub
函數有四個參數:目標串,模式串,替換串,(可選:最多替換的個數)
返回替換後的字符串和替換的次數。
local str1 = "hello Maria! hello Mical! hello Sam!"
local str2, times1 = string.gsub(str1, "hello", "hi")
print( str2, times1) --hi Maria! hi Mical! hi Sam!3
local str3, times2 = string.gsub(str1, "hello", "hi", 2)
print( str3, times2) --hi Maria! hi Mical! hello Sam!2
string.gsub(s, pattern, func)
local strr = string.gsub(str1, "hello", function(s)
return s.."_"
end)
print(strr)--hello_ Maria! hello_ Mical! hello_ Sam!
五、string.gfind(s, pattern)
返回一個迭代器,迭代器每執行一次,返回下一個匹配串;
iter = string.gfind("a=b c=d", "[^%s+]=[^%s+]")
print(iter()) -- a=b
print(iter()) -- c=d
一般用於泛性for循環,下面的例子結果同上
for s in string.gfind("a=b c=d", "[^%s+]=[^%s+]") do
print(s) -- a=b c=d
end
六、string.dump (function [, strip])
返回包含有以二進制方式表示的(一個 二進制代碼塊 )指定函數的字符串。
function log(value) print(value) end local str_fun = string.dump(log) print(str_fun) --<-LoaQ local fun = loadstring(str_fun) fun("hello")
模式:
對lua而言,模式串就是普通的字符串,並不受特殊對待。
一、字符類
. 任意字符
%a 字母
%c 控制字符
%d 數字
%l 小寫字母
%p 標點字符
%s 空白符
%u 大寫字母
%w 字符和數字
%z 表明0的字符
上面字符類的大寫形式表示小寫所表明的集合的補集。例如,'%A'表示非字母的字符。print(string.gsub("hello world", "%A", "_")) --hello_world 1
二、特殊字符
( ) . % + - * ? [ ^ $
'%'用做特殊字符的轉義字符,'%.'匹配點;'%%'匹配字符'%'。轉義字符'%'不只能夠用來轉義特殊字符,還能夠用於全部的非字母的字符。當對一個字符有疑問的時候,爲安全起見請使用轉義字符轉義它。
用'[]'建立字符集:(能夠使用連字符'-',在'[]'開始出使用'^'表示補集)
'[%w_]' 匹配數字字母和下劃線,
'[01]' 匹配二進制數字,
'[%[%]]' 匹配方括號。
'[0-9]' 匹配0到9之間的數
'[^0-7]' 匹配不是0到7之間的字符
三、模式修飾符
+ 匹配前一字符1次或屢次,最長匹配
* 匹配前一字符0次或屢次,最長匹配
- 匹配前一字符0次或屢次,最短匹配
? 匹配前一字符0次或1次
'+'匹配一個或多個字符,老是進行最長匹配。
print(string.gsub("hello Sam.", "%a+", "***")) --*** ***.2
'*'與'+'相似,可是它匹配一個字符0次或屢次出現。
'-'與'*'同樣,都匹配一個字符的0次或屢次出現,可是它進行的是最短匹配。
print(string.gsub("(hello)world)", "%(.*%)", "*")) --*1
print(string.gsub("(hello)world)", "%(.-%)", "*")) --*world)1
以'^'開頭的模式只匹配目標串的開始部分,以'$'結尾的模式只匹配目標串的結尾部分。
print(string.gsub("(hello)(world)", "%(.-%)", "*")) --**2
print(string.gsub("(hello)(world)", "^%(.-%)", "*")) --*(world)1
print(string.gsub("(hello)(world)", "%(.-%)$", "*")) --*1
'%b'用來匹配對稱的字符。常寫爲'%bxy',x和y是任意兩個不一樣的字符;x做爲匹配的開始,y做爲匹配的結束。
'%b()' 匹配以'('開始,以')'結束的字符串。
'%b[]' '%b<>'
function string.split(input, delimiter) input = tostring(input) delimiter = tostring(delimiter) if (delimiter=='') then return false end local pos,arr = 0, {} -- for each divider found for st,sp in function() return string.find(input, delimiter, pos, true) end do table.insert(arr, string.sub(input, pos, st - 1)) pos = sp + 1 end table.insert(arr, string.sub(input, pos)) return arr end
--[[
UTF-8
0000 - 007F
0XXXX XXXX
0080 - 07FF
110XXXXX 10XXXXXX
0800 - FFFF
1110XXXX 10XXXXXX 10XXXXXX
]]