最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2015年04月23日 10:23:50   投稿:junjie  
這篇文章主要介紹了Lua中的string庫和強大的模式匹配學習筆記,本文著重總結了string庫的一些操作方法和函數(shù),需要的朋友可以參考下

lua原生解釋器對字符串的處理能力是十分有限的,強大的字符串操作能力來自于string庫。lua的string函數(shù)導出在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數(shù)組進行排序,并不區(qū)分大小寫,你可能像這么寫:

復制代碼 代碼如下:

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

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

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

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

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

復制代碼 代碼如下:

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可以接受第三個參數(shù),返回i,j之間的多個值。例如,這么寫將字符串轉成字符值數(shù)組:

復制代碼 代碼如下:

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

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

string.char(unpack(t))

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

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

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

復制代碼 代碼如下:

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

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

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"這樣的固定模式來說,這個函數(shù)就沒啥意義了。但是對于可變模式來說,就顯示出他的強大威力了:
復制代碼 代碼如下:

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

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

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

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

模式:

字符類:(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_]匹配字母數(shù)字字符和下劃線。
[01]匹配二進制數(shù)
2.要想字符集內包含字符區(qū)間,起止之間加上-
[0-9] 相當于 %d
[0-9a-fA-F]相當于 %x
3.如果想得到該字符集的互補,前面加上^
[^0-7] 任何非八進制數(shù)字

重復或可選修飾符

復制代碼 代碼如下:

+ 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的參數(shù)可以是string,其實,也可以是個函數(shù),或是table,如果是函數(shù),就會用捕獲的內容作為參數(shù)調用該函數(shù),將返回的內容作為替換字符串。如果是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?"))

(完)

相關文章

  • C++中調用Lua函數(shù)實例

    C++中調用Lua函數(shù)實例

    這篇文章主要介紹了C++中調用Lua函數(shù)實例,本文給出了Lua和C++的代碼,并對步驟做了講解,需要的朋友可以參考下
    2014-09-09
  • Lua調用自定義C模塊

    Lua調用自定義C模塊

    Lua可以調用C函數(shù)的能力將極大的提高Lua的可擴展性和可用性。對于有些和操作系統(tǒng)相關的功能,或者是對效率要求較高的模塊,我們完全可以通過C函數(shù)來實現(xiàn),之后再通過Lua調用指定的C函數(shù)。對于那些可被Lua調用的C函數(shù)而言,其接口必須遵循Lua要求的形式
    2015-09-09
  • Lua中的metatable介紹

    Lua中的metatable介紹

    這篇文章主要介紹了Lua中的metatable介紹,Lua 中的每個值都可以用一個 metatable,個 metatable 就是一個原始的 Lua table,它用來定義原始值在特定操作下的行為,要的朋友可以參考下
    2015-04-04
  • Lua教程(十四):字符串庫詳解

    Lua教程(十四):字符串庫詳解

    這篇文章主要介紹了Lua教程(十四):字符串庫詳解,本文講解了基礎字符串函數(shù)、模式匹配函數(shù)、模式、捕獲(capture):、替換等內容,需要的朋友可以參考下
    2015-04-04
  • 詳解Lua中的數(shù)據(jù)類型

    詳解Lua中的數(shù)據(jù)類型

    這篇文章主要介紹了Lua中的數(shù)據(jù)類型,是Lua入門學習中的基礎知識,需要的朋友可以參考下
    2015-05-05
  • Lua中的迭代器和泛型for實例

    Lua中的迭代器和泛型for實例

    這篇文章主要介紹了Lua中的迭代器和泛型for實例,本文還講解了無狀態(tài)迭代器,需要的朋友可以參考下
    2014-09-09
  • Lua簡介、編譯安裝教程及變量等語法介紹

    Lua簡介、編譯安裝教程及變量等語法介紹

    這篇文章主要介紹了Lua簡介、編譯安裝教程及變量等語法介紹,本文同時講解了lua注釋語法、Lua命令行方式等內容,需要的朋友可以參考下
    2014-10-10
  • openresty中使用lua-nginx創(chuàng)建socket實例

    openresty中使用lua-nginx創(chuàng)建socket實例

    這篇文章主要介紹了openresty中使用lua-nginx創(chuàng)建socket實例,本文直接給出代碼實例和運行效果,需要的朋友可以參考下
    2015-04-04
  • Lua中pairs與ipairs的區(qū)別總結

    Lua中pairs與ipairs的區(qū)別總結

    這篇文章主要給大家介紹了關于Lua中pairs與ipairs區(qū)別的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧
    2018-09-09
  • Lua獲取utf8字符串長度和字符串截取并用...代替

    Lua獲取utf8字符串長度和字符串截取并用...代替

    這篇文章主要介紹了Lua獲取utf8字符串長度和字符串截取并用...代替,本文直接給出兩個函數(shù)的實現(xiàn)代碼,需要的朋友可以參考下
    2015-04-04

最新評論

台南县| 临泽县| 双牌县| 米林县| 铜鼓县| 泰安市| 和政县| 东乡| 武夷山市| 共和县| 灵寿县| 屏东县| 北碚区| 红原县| 琼海市| 株洲市| 五常市| 普格县| 禹城市| 临邑县| 元谋县| 孙吴县| 房山区| 沐川县| 新邵县| 汨罗市| 甘泉县| 周宁县| 龙泉市| 满城县| 平陆县| 页游| 武宁县| 七台河市| 子长县| 双牌县| 黄山市| 连平县| 仁化县| 青岛市| 改则县|