Lua 字串尋找函數 string.find(s, pattern [, init [, plain]] )

來源:互聯網
上載者:User

原文連結:http://blog.csdn.net/zhangxaochen/article/details/8084396

函數原型 string.find(s, pattern [, init [, plain]] )
 s: 源字串
 pattern: 待搜尋模式串
 init: 可選, 起始位置
 plain: 我沒用過
 
 ① 子串匹配:
 

print(string.find("haha", 'ah') )  ----- 輸出 2 3

 注意: lua 裡面數組或者字串的字元, 其下標索引是從 1 開始, 不是 0
  string.find 預設情況下返回兩個值, 即尋找到的子串的 起止下標, 如果不存在匹配返回 nil。
 如果我們只想要 string.find 返回的第二個值, 可以使用 虛變數(即 底線)
 

_, q=string.find("haha", 'ah') print(q)  ----- 輸出 3

 
 ② 模式比對:
 

pair = " name = Anna " print(string.find(pair, "(%a+)%s*=%s*(%a+)") ---- 輸出 2 12 name Anna

 解釋:
 如果 find 的第二個參數使用了某種匹配模式, 並且模式串裡面帶括弧。 那麼表示會“捕捉”括弧括起來的模式比對到的字串。 捕捉, 當然會把他們作為傳回值。這裡捕捉了兩下, 所以 find 多返回了兩個值
 
 那麼, 這個模式是怎麼匹配的呢?
 Lua 支援的字元類有:
 
 .  任一字元
 %s 空白符
 %p 標點
 %c 控制字元
 %d 數字
 %x 十六進位數
 %z 代表0的字元
 %a 字母
 %l 小寫字母
 %u 大寫字母
 %w 字母數字
字元類的大寫形式代表相應集合的補集, 比如 %A 表示除了字母以外的字元集
另外,* + - 三個,作為萬用字元分別表示:
*: 匹配前面指定的 0 或多個同類字元, 儘可能匹配更長的合格字串
+: 匹配前面指定的 1 或多個同類字元, 儘可能匹配更長的合格字串
-: 匹配前面指定的 0 或多個同類字元, 儘可能匹配更短的合格字串

於是, "(%a+)%s*=%s*(%a+)" 表示, 先匹配一個或多個字母, 然後是零個或多個空白符(比如空格), 然後是個 '=', 然後空白符, 然後字母。這樣, 滿足匹配的只有 "name = Anna"。 所以輸出位置為 2 12.
因為捕獲了兩個 (%a+), 也就是 name, Anna 這兩個單詞, 所以還輸出了這兩個單詞

另外, lua 使用 %1-%9 表示拷貝捕獲。舉例說:

s="abc \"it's a cat\""_,_,_,q=string.find(s, "([\"'])(.-)%1")print(q)  -----輸出: it's a cat

首先, [\"'] 表示匹配 雙引號或者單引號, 因為有括弧,所以引號被捕獲。 然後匹配幾個任一字元並且捕獲他, 最後 %1 匹配與第一次捕獲到的(即引號)相同的字串。所以整個模式比對到的是 "it's a cat", 而第二次捕獲的是去掉兩頭引號的字串, 即 it's a cat.

還有, '-' 與 '*' 到底有什麼不同呢? 在上面, "([\"'])(.*)%1" 匹配到的結果與 '-' 是一樣的。儘可能匹配更長, 儘可能匹配更短 究竟什麼不同呢?看例子:

print( ("\"hello\" \"hello\""):find('"(.+)"') )  ----輸出 1 15 hello" "helloprint( ("\"hello\" \"hello\""):find('"(.-)"') )  ----輸出 1 7 hello

* 儘可能長, 所以匹配了首尾兩個 引號, 捕獲了中間的 (hello" "hello)
- 儘可能短, 所以碰到第二個引號就說匹配完了, 因此只捕獲了第一個 (hello)

原文連結:http://blog.csdn.net/zhangxaochen/article/details/8084396
 

{{OVER}}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.