lua_string_pattern
兩大特點:
1. string庫中所有的字符索引從前往后是1,2,...;從后往前是-1,-2,...
2. string庫中所有的function都不會直接操作字符串,而是返回一個新的字符串。
?
庫函數:
1、string.len,string.rep,string.upper,string.lower,string.sub,string.format
local str = "abc"
print(string.len(str)) --6
print(string.rep(str, 2^2)) --abcabcabcabc
print(string.upper(str)) --ABC
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,
?
2、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。
?
?
3、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
?
4、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!
?
5、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
?6、string.dump (function [, strip])
返回包含有以二進制方式表示的(一個?二進制代碼塊?)指定函數的字符串。
function log(value)print(value) endlocal str_fun = string.dump(log)print(str_fun) --<-LoaQlocal fun = loadstring(str_fun)fun("hello")?
?
模式:
對lua而言,模式串就是普通的字符串,并不受特殊對待。
1、字符類
.??????????? 任意字符
%a??????? 字母
%c???????? 控制字符
%d??????? 數字
%l???????? 小寫字母
%p??????? 標點字符
%s???????? 空白符
%u??????? 大寫字母
%w?????? 字符和數字
%z???????? 代表0的字符
上面字符類的大寫形式表示小寫所代表的集合的補集。例如,'%A'表示非字母的字符。print(string.gsub("hello world", "%A", "_")) --hello_world 1
2、特殊字符
(???? )????? .????? %??? +???? -????? *???? ????? [????? ^???? $
'%'用作特殊字符的轉義字符,'%.'匹配點;'%%'匹配字符'%'。轉義字符'%'不僅可以用來轉義特殊字符,還可以用于所有的非字母的字符。當對一個字符有疑問的時候,為安全起見請使用轉義字符轉義它。
用'[]'創建字符集:(可以使用連字符'-',在'[]'開始出使用'^'表示補集)
????? '[%w_]'? 匹配數字字母和下劃線,
????? '[01]'????? 匹配二進制數字,
????? '[%[%]]'? 匹配方括號。
????? '[0-9]'???? 匹配0到9之間的數
????? '[^0-7]'?? 匹配不是0到7之間的字符
3、模式修飾符
+ 匹配前一字符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 endlocal pos,arr = 0, {}-- for each divider foundfor st,sp in function() return string.find(input, delimiter, pos, true) end dotable.insert(arr, string.sub(input, pos, st - 1))pos = sp + 1endtable.insert(arr, string.sub(input, pos))return arr end?
?
--[[
UTF-8
0000 - 007F
0XXXX XXXX
0080 - 07FF
110XXXXX ?10XXXXXX
0800 - FFFF
1110XXXX ?10XXXXXX 10XXXXXX
]]
?
轉載于:https://www.cnblogs.com/wrbxdj/p/5417978.html
總結
以上是生活随笔為你收集整理的lua_string_pattern的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Zookeeper和分布式环境中的假死脑
- 下一篇: 描述用户场景