亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

Lua中的string庫和強大的模式匹配學習筆記

2024-07-21 23:04:40
字體:
來源:轉載
供稿:網友

lua原生解釋器對字符串的處理能力是十分有限的,強大的字符串操作能力來自于string庫。lua的string函數導出在string module中。在lua5.1,同時也作為string類型的成員方法,因此,我們既可以寫成string.upper(s), 也可以s:upper(),選擇你喜歡的寫法。

string.len(s)返回s的長度。
string.rep(s, n)返回重復s字符串n次的字符串。
string.lower(s)返回一份已將大寫轉成小寫的字符串s的拷貝
lower,upper都是使用本地字符集的,另外,如果你想對一個string數組進行排序,并不區分大小寫,你可能像這么寫:

復制代碼 代碼如下:

table.sort(a, function(a, b)
     return string.lower(a) < string.lower(b)
end)

string.sub(s, i, j)將從s提取一段字符串,從i到j(閉區間[i, j]),當然你可以使用負索引值,將從字符串尾部算起,-1是最后一個字符,-2是倒數第二,等等,這么做的好處是當我們要提取直到末尾幾個字符時,從后面數起就很方便。例如:
復制代碼 代碼如下:

s = "[hello,world]"
print(string.sub(s, 2, -2)) --> hello,world

記住,lua中的字符串是不可變的。

 

string.char, string.byte用于轉換字符和對于的數字之間值。例如:

復制代碼 代碼如下:

i = 97
print(string.char(i, i+1, i+2)) --> abc
print(string.byte("abc"))       --> 97
print(string.byte("abc"), -2)   --> 98

 

lua5.1 string.byte可以接受第三個參數,返回i,j之間的多個值。例如,這么寫將字符串轉成字符值數組:

復制代碼 代碼如下:

t = {s.byte(1, -1}

要想重新轉成字符串的話:
復制代碼 代碼如下:

string.char(unpack(t))

 

string.format是強大字符串格式化函數,和c語言的printf類似,這里不累述。

lua string庫里最強大的函數是那些模式匹配函數:find, match, gsub, gmatch。和其他腳本語言不同,lua既沒有用POSIX的正則表達式,也沒有用perl的正則表達式。原因是實現這些導致lua占用更多內存,而lua的初衷是小巧的,嵌入應用的語言。 lua用少于500行的代碼實現了自己的一套模式匹配,雖然不如標準的正則表達式強(一般需要4000以上代碼),但也足夠強大。

string.find將查找目標模板在給定字符串中出現的位置,找到返回起始和結束位置,沒找到返回nil。例如:

復制代碼 代碼如下:

s = "hello,world"
i, j = string.find(s, "hello")
print(string.sub(s, i, j))

當然,string.find還可以給定起始搜索位置,當你想找出所有出現的位置時,這個參數就很有用,例如想知道換行符出現在那些地方:
復制代碼 代碼如下:

local t = {}
local i = 0
while true do
     i = string.find(s, "/n", i+1)
     if i == nil then break end
     t[#t+1] = i
end

 

string.match和string.find類似,都是在指定的string中查找相應的模式。不同的是,他返回的是找到的那部分string:

復制代碼 代碼如下:

print(string.match("hello,world","hello")) --> hello

對于像"hello"這樣的固定模式來說,這個函數就沒啥意義了。但是對于可變模式來說,就顯示出他的強大威力了:
復制代碼 代碼如下:

date = "now is 2014/10/6 17:58"
d = string.match(date, "%d+/%d+/%d+")
print(d)   --> 2014/10/6

string.gsub有三個參數,給定字符串,匹配模式和替代字符串。作用就是將所有符合匹配模式的地方都替換成替代字符串。并返回替換后的字符串,以及替換次數。
復制代碼 代碼如下:

s = string.gsub("Lua is cute", "cute", "great")
print(s) --> Lua is great

string.gmatch函數將返回一個迭代器,用于迭代所有出現在給定字符串中的匹配字符串。

 

模式:

字符類:(character classes)

復制代碼 代碼如下:

. all characters
%a letters
%c control characters
%d digits
%l lower -case letters
%p punctuation characters
%s space characters
%u upper-case letters
%w alphanumeric characters
%x hexadecimal digits
%z the character whose representation is 0

他們的大寫版本是他本身的互補。
魔法字符:
復制代碼 代碼如下:

( ) . % + - * ? [ ] ^ $

用%進行轉義。'%%'代表'%'

 

字符集(char -set ):使用字符集可以自定義字符類。

1.不同的字符類,和單字符之間用[]
[%w_]匹配字母數字字符和下劃線。
[01]匹配二進制數
2.要想字符集內包含字符區間,起止之間加上-
[0-9] 相當于 %d
[0-9a-fA-F]相當于 %x
3.如果想得到該字符集的互補,前面加上^
[^0-7] 任何非八進制數字

重復或可選修飾符

復制代碼 代碼如下:

+ 1 or more repetitions,匹配最長的,
* 0 or more repetitions  最長的
- also 0 or more repetitions 最短的
? optional (0 or 1 occurrence)

 

捕獲

捕獲機制允許一個模式串中的一部分來匹配目標串種的一部分。寫法是模式串中你需要捕獲的那部分用()括起來,例如:

復制代碼 代碼如下:

pair = "name = anna"
key, value = string.match(pair, "(%a+)%s*=%s*(%a+)")
print(key, value) --> name anna

我們也可以將捕獲用于模式串自身,"([/"'])(.-)%1",這里的%1表示匹配第一個捕獲的一份拷貝。

 

替換

前面已知道,string.gsub的參數可以是string,其實,也可以是個函數,或是table,如果是函數,就會用捕獲的內容作為參數調用該函數,將返回的內容作為替換字符串。如果是table,則用捕獲的內容為key去取table的值來作為替換字符串,如果不存在,就不做替換。如:

復制代碼 代碼如下:

function expand(s)
     return string.gsub(s, "$(%w+)", _G)
end
name = "Lua"; status = "great"
print(expand("$name is $status, isn't it?"))

(完)
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
岛国av午夜精品| 国产精品夜间视频香蕉| 国产欧美一区二区白浆黑人| 欧美精品一区在线播放| 久久久女女女女999久久| 国产精品久久综合av爱欲tv| 777国产偷窥盗摄精品视频| 亚洲欧美日韩久久久久久| 久久精品国产亚洲精品2020| 国产日韩欧美夫妻视频在线观看| 中文字幕久热精品视频在线| 日韩av男人的天堂| 欧美国产精品va在线观看| 成人久久久久久久| 亚洲国产精彩中文乱码av| 国产91热爆ts人妖在线| 亚洲另类xxxx| 亚洲国产精品久久久久秋霞蜜臀| 亚洲欧美成人精品| 亚洲va欧美va国产综合久久| 精品偷拍各种wc美女嘘嘘| 日韩精品在线免费播放| 免费av一区二区| 久久福利网址导航| 性色av一区二区三区在线观看| 深夜福利日韩在线看| 久久成人亚洲精品| 亚洲无线码在线一区观看| 国产一区二中文字幕在线看| 亚洲人成在线观看网站高清| 久久人91精品久久久久久不卡| 日韩精品有码在线观看| 国产精品久久久久久中文字| 韩国国内大量揄拍精品视频| 国产精品综合久久久| 精品国产一区二区三区在线观看| 九色精品免费永久在线| 欧美激情性做爰免费视频| 欧美大肥婆大肥bbbbb| 欧洲成人性视频| 欧美黑人巨大xxx极品| 国产精品xxxxx| 欧美黑人狂野猛交老妇| 免费91在线视频| 68精品国产免费久久久久久婷婷| 久久精品久久久久| 国产69精品99久久久久久宅男| 亚洲欧美日韩第一区| 91亚洲人电影| 精品久久久久久亚洲国产300| 亚洲乱码一区av黑人高潮| 欧美噜噜久久久xxx| 国产精品久久久久久久久免费看| 成人激情视频小说免费下载| 精品丝袜一区二区三区| 91情侣偷在线精品国产| 国产精品∨欧美精品v日韩精品| 国产精品日韩专区| 97超碰蝌蚪网人人做人人爽| 国产精品久久久亚洲| 日韩av影视综合网| 性视频1819p久久| 91国语精品自产拍在线观看性色| 欧美老女人性生活| 久操成人在线视频| 尤物99国产成人精品视频| 日日噜噜噜夜夜爽亚洲精品| 热久久免费视频精品| 日韩精品在线第一页| 亚洲偷熟乱区亚洲香蕉av| 久久久精品免费| 日本精品视频在线播放| 在线播放亚洲激情| 国产主播在线一区| 国产精品视频在线观看| 欧美成人网在线| 91九色国产在线| 狠狠干狠狠久久| 精品日本美女福利在线观看| 国产美女精品视频免费观看| 成人黄色激情网| 国产999精品久久久| 日韩综合视频在线观看| 日韩欧美中文字幕在线观看| 美日韩在线视频| 蜜臀久久99精品久久久无需会员| 在线视频国产日韩| 这里只有精品在线观看| 久久人人爽人人爽人人片av高请| 日韩精品丝袜在线| 日韩av免费在线播放| 色偷偷av一区二区三区| 国产女同一区二区| 北条麻妃在线一区二区| 搡老女人一区二区三区视频tv| 国产婷婷97碰碰久久人人蜜臀| 日韩精品极品毛片系列视频| 欧美裸体xxxx极品少妇| 国产日韩欧美黄色| 日韩精品久久久久久久玫瑰园| 亚洲乱码av中文一区二区| 亚洲精品美女免费| 亚洲午夜未满十八勿入免费观看全集| 欧美精品在线第一页| 精品国产成人av| 欧美一级淫片videoshd| 国产a∨精品一区二区三区不卡| 97在线视频免费播放| 国产精品亚洲片夜色在线| 黄色一区二区在线观看| 欧美午夜片欧美片在线观看| 亚洲xxxx3d| 亚洲精品一区二区在线| 色综合久久悠悠| 一本大道久久加勒比香蕉| 欧美疯狂性受xxxxx另类| 日韩一区二区久久久| 亚洲精品福利资源站| 久久精品在线视频| 精品亚洲一区二区三区在线观看| 亚洲色图av在线| 日韩欧美有码在线| 日韩欧美在线观看| 91国内揄拍国内精品对白| 午夜精品久久久久久99热| 一区二区成人av| 97在线观看免费高清| 色综合导航网站| 亚洲视屏在线播放| 欧美乱妇高清无乱码| 欧美日韩激情网| 国产亚洲综合久久| 日韩中文第一页| 亚洲综合自拍一区| 精品中文字幕久久久久久| www.色综合| 日韩免费看的电影电视剧大全| 欧美在线国产精品| 日本视频久久久| 97国产精品免费视频| 日本不卡高字幕在线2019| 日韩av在线电影网| 97国产真实伦对白精彩视频8| 不卡av在线播放| 亚洲国产欧美日韩精品| 国产成人免费av电影| 欧美一区二区视频97| 精品呦交小u女在线| 日韩最新中文字幕电影免费看| 国产欧美精品一区二区三区介绍| 精品少妇v888av| 国产精品久久久久久搜索| 成人精品一区二区三区电影黑人| 中文字幕亚洲一区二区三区| 91成人性视频| 激情懂色av一区av二区av| 日韩国产在线看| 日韩欧美在线播放| 韩国v欧美v日本v亚洲| 26uuu另类亚洲欧美日本一| 一区二区三区四区视频| 懂色aⅴ精品一区二区三区蜜月| 国产精品视频免费观看www| 一区二区亚洲精品国产|