青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運轉(zhuǎn),開心的工作
簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

Lua模式匹配

Posted on 2014-11-05 20:56 S.l.e!ep.¢% 閱讀(562) 評論(0)  編輯 收藏 引用 所屬分類: Lua

模式匹配函數(shù)

在string庫中功能最強大的函數(shù)是:

string.find (字符串查找)
string.gsub (全局字符串替換)
string.gfind (全局字符串查找)
string.gmatch (返回查找到字符串的迭代器)

這些函數(shù)都是基于模式匹配的。
與其他腳本語言不同的是,Lua并不使用POSIX規(guī)范的正則表達(dá)式[4](也寫作regexp)來進(jìn)行模式匹配。主要的原因出于程序大小方面的考慮:實現(xiàn)一個典型的符合POSIX標(biāo)準(zhǔn)的regexp大概需要4000行代碼,這比整個Lua標(biāo)準(zhǔn)庫加在一起都大。權(quán)衡之下,Lua中的模式匹配的實現(xiàn)只用了500行代碼,當(dāng)然這意味著不可能實現(xiàn)POSIX所規(guī)范的所有更能。然而,Lua中的模式匹配功能是很強大的,并且包含了一些使用標(biāo)準(zhǔn)POSIX模式匹配不容易實現(xiàn)的功能。

string.gmatch(str, pattern)? ?????

這是一個返回迭代器的函數(shù). 實際的用例如下:

s = "hello world from Lua"
for w in string.gmatch(s, "%a+") do
 print(w)
end

這里是一個捕獲并將配對字符分別存到不同變量的例子:

t = {}
s = "from=world, to=Lua"
for k, v in string.gmatch(s, "(%w+)=(%w+)") do
 t[k]=v
end
for k, v in pairs(t) do
 print(k, v)
end

string.gsub(str, pattern, repl, n)

string.gsub()函數(shù)根據(jù)給定的配對表達(dá)式對源字符串str進(jìn)行配對, 同時返回源字符串的一個副本, 該副本中成功配對的所有子字符串都將被替換. 函數(shù)還將返回成功配對的次數(shù). 實際的替換行為由repl參數(shù)的類型決定:

當(dāng)repl為字符串時, 所有成功配對的子字符串均會被替換成指定的repl字串.
當(dāng)repl為table時, 對每個成功配對的子字符串, 函數(shù)均會試圖尋找以其為key值的table中的元素, 并返回該元素. 如果該配對包含任何捕獲信息, 則以編號為1號的捕獲作為key值進(jìn)行查找.
當(dāng)repl為函數(shù)時, 每個成功配對的子字符串均會作為參數(shù)被傳入到該函數(shù)中去.
在repl是table或函數(shù)時, 如果該table或函數(shù)返回了字串或數(shù)字的值, 這個值依然會被用于替換副本字串中的配對子字串. 如果該table/函數(shù)返回的值為空, 將不發(fā)生替換.

n參數(shù)可選, 當(dāng)它被指定時, string.gsub()函數(shù)只對源字符串中的前n個成功配對的成員進(jìn)行操作.

以下是幾個例子:

> print(string.gsub("hello world", "(%w+)", "%1 %1"))
hello hello world world 2

> print(string.gsub("hello Lua", "(%w+)%s*(%w+)", "%2 %1"))
Lua hello 1

> string.gsub("hello world", "%w+", print)
hello world 2

> lookupTable = {["hello"] = "hola", ["world"] = "mundo"}
> print(string .gsub("hello world", "(%w+)", lookupTable))
hola mundo 2


string.match(str, pattern, init)

string.match()只尋找源字串str中的第一個配對. 參數(shù)init可選, 指定搜尋過程的起點, 默認(rèn)為1.

在成功配對時, 函數(shù)將返回配對表達(dá)式中的所有捕獲結(jié)果; 如果沒有設(shè)置捕獲標(biāo)記, 則返回整個配對字符串. 當(dāng)沒有成功的配對時, 返回nil.


string.match("abcdaef", "a")
-> a

string.reverse(str)
返回一個字符串的倒序排列
string.reverse("abcde")
->edcba

string.dump(function)
返回指定函數(shù)的二進(jìn)制代碼(函數(shù)必須是一個Lua函數(shù),并且沒有上值)


string.find(str, pattern, init, plain)
string.find的基本應(yīng)用就是用來在目標(biāo)串(subject string)內(nèi)搜索匹配指定的模式的串。函數(shù)如果找到匹配的串返回他的位置,否則返回nil.最簡單的模式就是一個單詞,僅僅匹配單詞本身。比如,模式'hello'僅僅匹配目標(biāo)串中的"hello"。當(dāng)查找到模式的時候,函數(shù)返回兩個值:匹配串開始索引和結(jié)束索引。
s = "hello world"
string.find(s, "hello")????--> 1??? 5
string.find(s, "world")??? --> 7??? 11
string.find(s, "l")????????--> 3??? 3
string.find(s, "lll")????? --> nil
string.find函數(shù)第三個參數(shù)是可選的:標(biāo)示目標(biāo)串中搜索的起始位置。當(dāng)我們想查找目標(biāo)串中所有匹配的子串的時候,這個選項非常有用。我們可以不斷的循環(huán)搜索,每一次從前一次匹配的結(jié)束位置開始。下面看一個例子,下面的代碼用一個字符串中所有的新行構(gòu)造一個表:
local t = {}????? -- 存放回車符的位置
local i = 0
while true do
??? i = string.find(s, "\n", i+1)? --?查找下一行
??? if i == nil then break end
??? table.insert(t, i)
end

string.sub(str,sPos,ePos)
string.gsub的功能是截取字符串,他從指定起始位置截取一個字符串。string.sub可以利用string.find返回的值截取匹配的子串。
對簡單模式而言,匹配的就是其本身
s = "hello world"
local i, j = string.find(s, "hello")????--> 1??? 5
string.sub(s, i, j)??????? --> hello

string.gsub(str, sourcestr, desstr)
string.gsub的基本作用是用來查找匹配模式的串,并將使用替換串其替換掉:
string.gsub函數(shù)有三個參數(shù):目標(biāo)串,模式串,替換串。
s = string.gsub("Lua is cute", "cute", "great")
print(s)????? --> Lua is great
s = string.gsub("all lii", "l", "x")
print(s)????? --> axx xii
s = string.gsub("Lua is great", "perl", "tcl")
print(s)????? --> Lua is great
第四個參數(shù)是可選的,用來限制替換的范圍:
s = string.gsub("all lii", "l", "x", 1)
print(s)????????? --> axl lii
s = string.gsub("all lii", "l", "x", 2)
print(s)????????? --> axx lii
string.gsub的第二個返回值表示他進(jìn)行替換操作的次數(shù)。例如,下面代碼涌來計算一個字符串中空格出現(xiàn)的次數(shù):
_, count = string.gsub(str, " ", " ")
(注意,_ 只是一個啞元變量)


模式

你還可以在模式串中使用字符類。字符類指可以匹配一個特定字符集合內(nèi)任何字符的模式項。比如,字符類%d匹配任意數(shù)字。所以你可以使用模式串'%d%d/%d%d/%d%d%d%d'搜索dd/mm/yyyy格式的日期:
s = "Deadline is 30/05/1999, firm"
date = "%d%d/%d%d/%d%d%d%d"
print(string.sub(s, string.find(s, date)))? ? --> 30/05/1999
下面的表列出了Lua支持的所有字符類:

單個字符(除^$()%.[]*+-?外): 與該字符自身配對
.(點): 與任何字符配對
%a: 與任何字母配對
%c: 與任何控制符配對(例如\n)
%d: 與任何數(shù)字配對
%l: 與任何小寫字母配對
%p: 與任何標(biāo)點(punctuation)配對
%s: 與空白字符配對
%u: 與任何大寫字母配對
%w: 與任何字母/數(shù)字配對
%x: 與任何十六進(jìn)制數(shù)配對
%z: 與任何代表0的字符配對
%x(此處x是非字母非數(shù)字字符): 與字符x配對. 主要用來處理表達(dá)式中有功能的字符(^$()%.[]*+-?)的配對問題, 例如%%與%配對
[數(shù)個字符類]:?與任何[]中包含的字符類配對. 例如[%w_]與任何字母/數(shù)字, 或下劃線符號(_)配對
[^數(shù)個字符類]: 與任何包含在[]中的字符類配對. 例如[^%s]與任何非空白字符配對

當(dāng)上述的字符類用 大寫 書寫時, 表示與 此字符類的任何字符配對. 例如, %S表示與任何非空白字符配對.例如,'%A'非字母的字符
print(string.gsub("hello, up-down!", "%A", "."))
? ?
--> hello..up.down. 4
(數(shù)字4不是字符串結(jié)果的一部分,他是gsub返回的第二個結(jié)果,代表發(fā)生替換的次數(shù)。下面其他的關(guān)于打印gsub結(jié)果的例子中將會忽略這個數(shù)值。)在模式匹配中有一些特殊字符,他們有特殊的意義,Lua中的特殊字符如下:
( ) . % + - * ? [ ^ $
'%' 用作特殊字符的轉(zhuǎn)義字符,因此 '%.' 匹配點;'%%' 匹配字符 '%'。轉(zhuǎn)義字符 '%'不僅可以用來轉(zhuǎn)義特殊字符,還可以用于所有的非字母的字符。當(dāng)對一個字符有疑問的時候,為安全起見請使用轉(zhuǎn)義字符轉(zhuǎn)義他。
對Lua而言,模式串就是普通的字符串。他們和其他的字符串沒有區(qū)別,也不會受到特殊對待。只有他們被用作模式串用于函數(shù)的時候,'%' 才作為轉(zhuǎn)義字符。所以,如果你需要在一個模式串內(nèi)放置引號的話,你必須使用在其他的字符串中放置引號的方法來處理,使用 '\' 轉(zhuǎn)義引號,'\' 是Lua的轉(zhuǎn)義符。你可以使用方括號將字符類或者字符括起來創(chuàng)建自己的字符類(譯者:Lua稱之為char-set,就是指傳統(tǒng)正則表達(dá)式概念中的括號表達(dá)式)。比如,'[%w_]' 將匹配字母數(shù)字和下劃線,'[01]' 匹配二進(jìn)制數(shù)字,'[%[%]]' 匹配一對方括號。下面的例子統(tǒng)計文本中元音字母出現(xiàn)的次數(shù):

_, nvow = string.gsub(text, "[AEIOUaeiou]", "")

在char-set中可以使用范圍表示字符的集合,第一個字符和最后一個字符之間用連字符連接表示這兩個字符之間范圍內(nèi)的字符集合。大部分的常用字符范圍都已經(jīng)預(yù)定義好了,所以一般你不需要自己定義字符的集合。比如,'%d' 表示 '[0-9]';'%x' 表示 '[0-9a-fA-F]'。然而,如果你想查找八進(jìn)制數(shù),你可能更喜歡使用 '[0-7]' 而不是 '[01234567]'。你可以在字符集(char-set)的開始處使用 '^' 表示其補集:'[^0-7]' 匹配任何不是八進(jìn)制數(shù)字的字符;'[^\n]' 匹配任何非換行符戶的字符。記住,可以使用大寫的字符類表示其補集:'%S' 比 '[^%s]' 要簡短些。
Lua的字符類依賴于本地環(huán)境,所以 '[a-z]' 可能與 '%l' 表示的字符集不同。在一般情況下,后者包括 '?' 和 '?',而前者沒有。應(yīng)該盡可能的使用后者來表示字母,除非出于某些特殊考慮,因為后者更簡單、方便、更高效。
可以使用修飾符來修飾模式增強模式的表達(dá)能力,Lua中的模式修飾符有四個:

+? ? ? 匹配前一字符1次或多次
*? ? ? 匹配前一字符0次或多次
-? ? ? 匹配前一字符0次或多次
?? ? ? 匹配前一字符0次或1次

'+',匹配一個或多個字符,總是進(jìn)行最長的匹配。比如,模式串 '%a+' 匹配一個或多個字母或者一個單詞:

print(string.gsub("one, and two; and three", "%a+", "word"))
? ?
--> word, word word; word word

'%d+' 匹配一個或多個數(shù)字(整數(shù)):

i, j = string.find("the number 1298 is even", "%d+")
print(i,j)? ? --> 12? 15

'*' 與 '+' 類似,但是他匹配一個字符0次或多次出現(xiàn) .一個典型的應(yīng)用是匹配空白。比如,為了匹配一對圓括號()或者括號之間的空白,可以使用 '%(%s*%)'。( '%s*' 用來匹配0個或多個空白。由于圓括號在模式中有特殊的含義,所以我們必須使用 '%' 轉(zhuǎn)義他。)再看一個例子,'[_%a][_%w]*' 匹配Lua程序中的標(biāo)示符:字母或者下劃線開頭的字母下劃線數(shù)字序列。
'-' 與 '*' 一樣,都匹配一個字符的0次或多次出現(xiàn),但是他進(jìn)行的是最短匹配。某些時候這兩個用起來沒有區(qū)別,但有些時候結(jié)果將截然不同。比如,如果你使用模式 '[_%a][_%w]-' 來查找標(biāo)示符,你將只能找到第一個字母,因為 '[_%w]-' 永遠(yuǎn)匹配空。另一方面,假定你想查找C程序中的注釋,很多人可能使用 '/%*.*%*/'(也就是說 "/*" 后面跟著任意多個字符,然后跟著 "*/" )。然而,由于 '.*' 進(jìn)行的是最長匹配,這個模式將匹配程序中第一個 "/*" 和最后一個 "*/" 之間所有部分:

test = "int x; /* x */ int y; /* y */"
print(string.gsub(test, "/%*.*%*/", "<COMMENT>"))
?
? --> int x; <COMMENT>

然而模式 '.-' 進(jìn)行的是最短匹配 ,她會匹配 "/*" 開始到第一個 "*/" 之前的部分:

test = "int x; /* x */ int y; /* y */"
print(string.gsub(test, "/%*.-%*/", "<COMMENT>"))
? ? --> int x; <COMMENT> int y; <COMMENT>

'?' 匹配一個字符0次或1次 。舉個例子,假定我們想在一段文本內(nèi)查找一個整數(shù),整數(shù)可能帶有正負(fù)號。模式 '[+-]?%d+' 符合我們的要求,它可以匹配像 "-12"、"23" 和 "+1009" 等數(shù)字。'[+-]' 是一個匹配 '+' 或者 '-' 的字符類;接下來的 '?' 意思是匹配前面的字符類0次或者1次。
與其他系統(tǒng)的模式不同的是,Lua中的修飾符不能用字符類;不能將模式分組然后使用修飾符作用這個分組。比如,沒有一個模式可以匹配一個可選的單詞(除非這個單詞只有一個字母)。下面我將看到,通常你可以使用一些高級技術(shù)繞開這個限制。
以 '^' 開頭的模式只匹配目標(biāo)串的開始部分,相似的,以 '$' 結(jié)尾的模式只匹配目標(biāo)串的結(jié)尾部分。這不僅可以用來限制你要查找的模式,還可以定位(anchor)模式。比如:

if string.find(s, "^%d") then ...

檢查字符串s是否以數(shù)字開頭,而

if string.find(s, "^[+-]?%d+$") then ...

檢查字符串s是否是一個整數(shù)。
'%b' 用來匹配對稱的字符。常寫為 '%bxy' ,x和y是任意兩個不同的字符;x作為匹配的開始,y作為匹配的結(jié)束。比如,'%b()' 匹配以 '(' 開始,以 ')' 結(jié)束的字符串:

print(string.gsub("a (enclosed (in) parentheses) line", "%b()", ""))
--> a line

常用的這種模式有:'%b()' ,'%b[]','%b%{%}' 和 '%b<>'。你也可以使用任何字符作為分隔符。

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            蜜乳av另类精品一区二区| 国产一区二区三区在线观看视频 | 欧美日韩亚洲高清一区二区| 亚洲精品乱码| 欧美ed2k| 欧美国产激情| 亚洲电影免费观看高清| 午夜一区不卡| 久热精品视频| 男女精品视频| 亚洲激情六月丁香| 日韩视频免费在线观看| 亚洲免费成人| 亚洲欧美日韩在线一区| 午夜久久久久久| 久久综合久久88| 欧美国产视频在线| 欧美精品一区二区在线观看| 欧美日韩中文另类| 国产婷婷97碰碰久久人人蜜臀| 欧美成人在线免费观看| 国产亚洲成人一区| 欧美不卡一区| 国产综合久久久久久| 亚洲精品一区二区三区婷婷月| 亚洲一区二区免费在线| 久久天天躁狠狠躁夜夜av| 亚洲欧洲精品一区二区精品久久久| 亚洲电影免费观看高清完整版在线观看 | 欧美暴力喷水在线| 亚洲黄色有码视频| 亚洲午夜精品久久| 久热精品视频在线观看一区| 国产精品视频精品视频| 亚洲区一区二| 欧美国产精品劲爆| 久久精品国产一区二区三| 国产精品高潮呻吟久久| 亚洲日产国产精品| 玖玖玖国产精品| 亚洲欧美国产日韩天堂区| 国产精品xxx在线观看www| 亚洲人成网站在线播| 久久久久久久一区二区三区| 亚洲免费电影在线| 欧美日韩精品免费观看视频完整| 欧美精品一区二区三区在线播放 | 欧美激情一区二区三区不卡| 蘑菇福利视频一区播放| 久久一区视频| 国内精品久久国产| 午夜精品婷婷| 欧美激情在线观看| 激情久久五月天| 国产精品男女猛烈高潮激情 | 久久久爽爽爽美女图片| 国产精品自拍三区| 欧美日韩一区综合| 欧美亚洲成人网| 国产精品你懂的在线欣赏| 国产精品一区二区久久久| 美女精品自拍一二三四| 国内久久视频| 在线观看91精品国产入口| 欧美日韩一区二区免费视频| 国产精品久久毛片a| 在线一区二区视频| 亚洲先锋成人| 亚洲电影在线观看| 欧美成人精品| 欧美国产先锋| 日韩亚洲欧美一区| 一本久久综合亚洲鲁鲁| 亚洲天堂黄色| 国产欧美一区二区精品忘忧草| 亚洲高清色综合| 亚洲一区二区三区四区视频| 好吊一区二区三区| 极品尤物av久久免费看| 亚洲欧洲av一区二区| 久久久久成人精品| av成人激情| 久久久久女教师免费一区| 国产麻豆精品在线观看| 亚洲午夜黄色| 亚洲欧美国内爽妇网| 亚洲国产福利在线| 亚洲成人在线网| 一本大道久久a久久综合婷婷| 久久久亚洲国产天美传媒修理工| 国产亚洲精久久久久久| 黄色在线一区| 日韩天堂av| 欧美成人日韩| 久久精品国亚洲| 亚洲清纯自拍| 亚洲制服欧美中文字幕中文字幕| 欧美激情精品| 国产精品日韩一区二区| 久久精品最新地址| 国内精品久久久久国产盗摄免费观看完整版| 国产精品自拍一区| 久久久久久亚洲精品杨幂换脸 | 韩日欧美一区二区三区| 亚洲国产高清视频| 欧美成人亚洲成人日韩成人| 国产欧美69| 制服丝袜亚洲播放| 国产乱子伦一区二区三区国色天香| 久久久免费av| 99国产一区| 黄色成人免费网站| 欧美成人小视频| 国产日本欧美一区二区三区在线| 美腿丝袜亚洲色图| 蜜桃av一区二区三区| 久久精品国产77777蜜臀| 欧美日韩www| 欧美大片91| 在线免费观看日本欧美| 国产主播精品在线| 亚洲无毛电影| 亚洲综合色网站| 久久久精品一品道一区| 午夜免费日韩视频| 欧美日韩成人一区| 久久久无码精品亚洲日韩按摩| 欧美中文在线免费| 欧美亚洲视频在线观看| 亚洲一区二区三区成人在线视频精品| 99亚洲精品| 亚洲国产成人午夜在线一区| 国产精品国色综合久久| 老司机亚洲精品| 国产亚洲毛片在线| 欧美成人综合一区| 午夜久久久久久久久久一区二区| 国产日韩欧美自拍| 亚洲视频免费| 久久国产精品色婷婷| 一本不卡影院| 欧美一区二区在线视频| 玖玖玖国产精品| 精品1区2区| 久久久7777| 一区二区三区四区在线| 蜜臀va亚洲va欧美va天堂| 亚洲片在线观看| 久久露脸国产精品| 亚洲一区二区三区免费在线观看 | 欧美成人一区二区在线| 亚洲午夜国产成人av电影男同| 久久九九国产精品怡红院| 午夜日韩在线| 国产婷婷精品| 欧美在线视频全部完| 欧美亚洲一区三区| 国产欧美视频一区二区| 欧美一区午夜视频在线观看| 香蕉久久精品日日躁夜夜躁| 国产欧美日韩视频一区二区三区| 午夜日韩在线| 久久女同互慰一区二区三区| 激情成人综合| 欧美日韩黄色大片| 西瓜成人精品人成网站| 欧美黑人多人双交| 亚洲欧美日韩国产| 亚洲第一精品夜夜躁人人爽| 欧美国产视频在线观看| 亚洲一区二区三区久久| 蜜臀a∨国产成人精品 | 亚洲国产精品999| 欧美日韩国产bt| 欧美一区二区三区在线视频| 欧美国产亚洲精品久久久8v| 一卡二卡3卡四卡高清精品视频| 欧美色欧美亚洲另类二区| …久久精品99久久香蕉国产| 亚洲精品日韩激情在线电影| 欧美亚洲免费电影| 亚洲国产精品久久久久婷婷884| 欧美激情综合在线| 久久99在线观看| 亚洲欧洲日产国码二区| 亚洲男人的天堂在线aⅴ视频| 国内精品久久久久影院薰衣草| 欧美a级片网| 性视频1819p久久| 欧美福利网址| 久久精品最新地址| 午夜精品福利在线观看| 在线观看国产欧美| 国产精品久久婷婷六月丁香| 欧美成人一品| 久久成人人人人精品欧| 亚洲国产精品一区制服丝袜| 香蕉av777xxx色综合一区| 一区二区三区国产在线| 亚洲激情一区二区三区|