lua的string庫與強大的模式匹配

2021-07-15 20:15:11 字數 3612 閱讀 6944

**:

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 =

要想重新轉成字串的話:

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

endstring.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)

endname = "lua"; status = "great"

print(expand("$name is $status, isn't it?"))

lua的string庫與強大的模式匹配

lua原生直譯器對字串的處理能力是十分有限的,強大的字串操作能力來自於string庫。lua的string函式匯出在string module中。在lua5.1,同時也作為string型別的成員方法,因此,我們既可以寫成string.upper s 也可以s upper 選擇你喜歡的寫法。strin...

lua的string庫與強大的模式匹配

lua原生直譯器對字串的處理能力是十分有限的,強大的字串操作能力來自於string庫。lua的string函式匯出在string module中。在lua5.1,同一時候也作為string型別的成員方法,因此,我們既能夠寫成string.upper s 也能夠s upper 選擇你喜歡的寫法。str...

Lua的string學習筆記

1.字元轉換成數字 使用tonumber 類似c裡面的atoi mystr 6 mynum tonumber mystr print mynum 2.數字轉換成字元竄 使用tostring 類似c裡面的itoa mynum 8 mystr tostring mynum print mystr pri...