lua使用string.match()時遇到的一些問題記錄
阿新 • • 發佈:2018-11-02
在某個地方看到了一行lua程式碼,當時沒看懂為什麼返回了這麼多值
local strContent = [[abcde csdn = {部落格} csdn.net]]
local strPattern = [[^(.*)(csdn%s*=%s*)(%b{})(.*)$]]
local strCapture1, strCapture2, strCapture3, strCapture4 = string.match(strContent, strPattern)
他返回的結果為:
strCapture1: abcde strCapture2: csdn = strCapture3: {部落格} strCapture4: csdn.net
當時完全弄不明白,對著菜鳥教程上的講義看了很多遍 ,講義如下:
string.match(str, pattern, init) string.match()只尋找源字串str中的第一個配對. 引數init可選, 指定搜尋過程的起點, 預設為1。 在成功配對時, 函式將返回配對錶達式中的所有捕獲結果; 如果沒有設定捕獲標記, 則返回整個配對字串. 當沒有成功的配對時, 返回nil |
思來想去,偶然發現這裡有四個返回值,而上面正則表示式大致也可以分為四個部分,這麼一說的話,是不是可以有更多個返回值呢,動手實驗才是王道:
local strContent = [[I Have a Dream i_have = { 2018-08-08 08:08:08 } dream Martin Luther King abcde]] local strPattern = [[^(.*)(i_have%s*=%s*)(%b{})(.*)(Martin)(.*)$]] local strCapture1, strCapture2, strCapture3, strCapture4, strCapture5, strCapture6 = string.match(strContent, strPattern) print("strCapture1: " .. strCapture1) print("strCapture2: " .. strCapture2) print("strCapture3: " .. strCapture3) print("strCapture4: " .. strCapture4) print("strCapture5: " .. strCapture5) print("strCapture6: " .. strCapture6)
這樣,我把正則表示式分了六個部分,是不是真會給我返回六個值呢,我們來看列印結果:
strCapture1: I Have a Dream
strCapture2: i_have =
strCapture3: { 2018-08-08 08:08:08 }
strCapture4: dream
strCapture5: Martin
strCapture6: Luther King abcde
果然如此,這就想不明白了,於是網上各種查資料,在一篇文章(文章連結:https://www.cnblogs.com/meamin9/p/4502461.html)中找到這麼一句話:
string.match(s, pattern[, init])
在字串s中匹配pattern,如果匹配失敗返回nil。否則,當pattern中沒有分組時,返回第一個匹配到的子串;當pattern中有分組時,返回第一個匹配到子串的分組,多個分組就返回多個。可選引數init表示匹配字串的起始索引,預設為1,可以為負索引。
注意標紅的這一段話,pattern中如果分組了,則會返回和分組數量對應的值,這樣,大體也就明白為何返回這麼多值了。