Lua string庫整理(v5.1)

string庫提供了字符串處理的通用函數(shù)。 例如字符串查找、子串、模式匹配等。 當(dāng)在 Lua 中對字符串做索引時,第一個字符從 1 開始計算(而不是 C 里的 0 )。 索引可以是負(fù)數(shù),它指從字符串末尾反向解析。 即,最后一個字符在 -1 位置處,等等。
字符串庫中的所有函數(shù)都在表string 中。 它還將其設(shè)置為字符串元表的__index 域。 因此,你可以以面向?qū)ο蟮男问绞褂米址瘮?shù)。 例如,string.byte(s,i) 可以寫成 s:byte(i)。

字符串庫假定采用單字節(jié)字符編碼

string.byte(s[,i[,j]])

返回字符串s[i]. s[i+1],...,s[j]的內(nèi)部數(shù)字編碼。i的默認(rèn)值是1,j的默認(rèn)值是i

s = 'abc'
print(string.byte(s))
print(string.byte(s,2))
print(string.byte(s,2,3))

Output:
97
98
98  99

string.char(...)

接收零或更多的整數(shù)。 返回和參數(shù)數(shù)量相同長度的字符串。 其中每個字符的內(nèi)部編碼值等于對應(yīng)的參數(shù)值。

print(string.char(98, 99, 100))

Output:
bcd

string.dump(function)

返回包含有以二進(jìn)制方式表示的(一個 二進(jìn)制代碼塊 )指定函數(shù)的字符串。 之后可以用 loadstring 調(diào)用這個字符串獲得 該函數(shù)的副本。

function必須是沒有upvalues的lua函數(shù)。

function dump()
    print("dump test  ")
end

s = string.dump(dump)
print(s)

func = loadstring(s)
func()

Output:
?LuaQ
dump test  

lua 5.3 有改動


string.find(s, pattern [,init [, plain]])

查找第一個字符串 s 中匹配到的 pattern 如果找到一個匹配,find 會返回 s 中關(guān)于它起始及終點位置的索引; 否則,返回 nil。 第三個可選數(shù)字參數(shù) init 指明從哪里開始搜索; 默認(rèn)值為 1 ,同時可以是負(fù)值。 第四個可選參數(shù) plain 為 true 時, 關(guān)閉模式匹配機制。 此時函數(shù)僅做直接的 “查找子串”的操作, 而 pattern 中沒有字符被看作魔法字符。 注意,如果給定了 plain ,就必須寫上 init。

如果在模式中定義了捕獲,捕獲到的若干值也會在兩個索引之后返回。

local s = "abcdefg"
print(string.find(s,"(c)"))
print(string.find(s,"(c)"),1, true)

Output:
3   3   c
3   1   true

string.format(formatstring, ...)

返回不定數(shù)量參數(shù)的格式化版本, 格式化串為第一個參數(shù)(必須是一個字符串)。 格式化字符串遵循 ISO C 函數(shù) sprintf 的規(guī)則。 不同點在于選項 *, h, L, l, n, p 不支持, 另外還增加了一個選項 q。 q 選項將一個字符串格式化為兩個雙引號括起,對內(nèi)部字符做恰當(dāng)?shù)霓D(zhuǎn)義處理的字符串。 該字符串可以安全的被 Lua 解釋器讀回來。 例如,調(diào)用

string.format('%q', 'a string with "quotes" and \n new line')

會產(chǎn)生字符串:

"a string with \"quotes\" and \new line"

E, e, f, G, and g 都期待一個對應(yīng)的數(shù)字參數(shù)。 選項 c, d, i, o, u, X, and x 則期待一個整數(shù)。 選項 q 期待一個字符串; 選項 s 期待一個沒有內(nèi)嵌零的字符串。

print(string.format("%d, %s", 1, "a"))

Output:
1, a

string.gmatch(s, pattern)

返回一個迭代器函數(shù)。 每次調(diào)用這個函數(shù)都會繼續(xù)以 pattern 對 s 做匹配,并返回所有捕獲到的值。 如果 pattern 中沒有指定捕獲,則每次捕獲整個 pattern。

對這個函數(shù)來說,模板前開始的 '^' 不會當(dāng)成錨點。因為這樣會阻止迭代。

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

Output:
hello
world
from
Lua

string.gsub(s, pattern, repl [, n])

將字符串 s 中,所有的(或是在 n 給出時的前 n 個) pattern 都替換成 repl ,并返回其副本。 repl 可以是字符串、表、或函數(shù)。 gsub 還會在第二個返回值返回一共發(fā)生了多少次匹配。 gsub 這個名字來源于 Global SUBstitution

如果 repl 是一個字符串,那么把這個字符串作為替換品。 字符 % 是一個轉(zhuǎn)義符: repl 中的所有形式為 %d 的串表示 第 d 個捕獲到的子串,d 可以是 1 到 9 。 串 %0 表示整個匹配。 串 %% 表示單個 %。

如果 repl 是張表,每次匹配時都會用第一個捕獲物作為鍵去查這張表。

如果 repl 是個函數(shù),則在每次匹配發(fā)生時都會調(diào)用這個函數(shù)。 所有捕獲到的子串依次作為參數(shù)傳入。

任何情況下,模板中沒有設(shè)定捕獲都看成是捕獲整個模板。

如果表的查詢結(jié)果或函數(shù)的返回結(jié)果是一個字符串或是個數(shù)字, 都將其作為替換用串; 而在返回 falsenil 時不作替換 (即保留匹配前的原始串)。

-- 匹配字符轉(zhuǎn)
-- 先匹配hello, %1 為匹配值,  將hello 替換為hello hello
-- 匹配world時 同理
print(string.gsub("hello world", "(%w+)", "%1 %1"))
print(string.gsub("hello world", "(%w+)", "%0 %0",1))

Output:
hello hello world world 2
hello hello world   1

-- 替換函數(shù)
print(string.gsub("4+5 = $return 4+5$", "%$(.-)%$", 
    function (s)
        print(s)
        return loadstring(s)()
    end))

Output:
return 4+5
4+5 = 9 1

--表
local t = {name="lua", version="5.3"}
print(string.gsub("$name-$version.tar.gz", "%$(%w+)", t))

Output:
lua-5.3.tar.gz  2

string.len(s)

接收一個字符串,返回其長度。 空串 "" 的長度為 0 。 內(nèi)嵌零也統(tǒng)計在內(nèi),因此 "a\000bc\000" 的長度為 5 。

print(string.len("hello world \0"))

Output:
13

string.lower(s)

接收一個字符串,將其中的大寫字符都轉(zhuǎn)為小寫后返回其副本。 其它的字符串不會更改。 對大寫字符的定義取決于當(dāng)前的區(qū)域設(shè)置。

print(string.lower("HeLLo World"))

Output:
hello world

tring.match(s, pattern [, init])

在字符串 s 中找到第一個能用 pattern匹配到的部分。 如果能找到,match 返回其中的捕獲物; 否則返回 nil 。 如果 pattern 中未指定捕獲, 返回整個 pattern 捕獲到的串。 第三個可選數(shù)字參數(shù) init 指明從哪里開始搜索; 它默認(rèn)為 1 且可以是負(fù)數(shù)。

print(string.match("hello world", "(%w+)"))
print(string.match("hello world", "(%w+)", -1))

Output:
hello
d

string.rep(s, n)

返回n個字符串s連在一起的字符串

print(string.rep("abc", 2))

Output:
abcabc

lua 5.3 有改動


string.reverse(s)

返回字符串 s 的翻轉(zhuǎn)串。

print(string.reverse("abc"))

Output:
cba

string.sub(s)

返回 s 的子串, 該子串從 i 開始到 j 為止; i 和 j 都可以為負(fù)數(shù)。 如果不給出 j ,就當(dāng)它是 -1 (和字符串長度相同)。 特別是, 調(diào)用 string.sub(s,1,j) 可以返回 s 的長度為 j 的前綴串, 而 string.sub(s, -i) 返回長度為 i的后綴串。

print(string.sub("Hello World", 5))
print(string.sub("Hello World", -3))

Output:
o World
rld

string.upper(s)

接收一個字符串,將其中的小寫字符都轉(zhuǎn)為大寫后返回其副本。 其它的字符串不會更改。 對小寫字符的定義取決于當(dāng)前的區(qū)域設(shè)置。

print(string.upper("Hello World"))

Output:
HELLO WORLD

匹配模式

字符類:

字符類 用于表示一個字符集合。 下列組合可用于字符類:

  • **x: *(這里 x 不能是 魔法字符 ^$()%.[]+-? 中的一員) 表示字符 x 自身。

  • **.: **(一個點)可表示任何字符。

  • **%a: **表示任何字母。

  • **%c: **表示任何控制字符。

  • **%d: **表示任何數(shù)字。

  • **%g: **表示任何除空白符外的可打印字符。

  • **%l: **表示所有小寫字母。

  • **%p: **表示所有標(biāo)點符號。

  • **%s: **表示所有空白字符。

  • **%u: **表示所有大寫字母。

  • **%w: **表示所有字母及數(shù)字。

  • **%x: **表示所有 16 進(jìn)制數(shù)字符號。

  • **%x: **(這里的 x 是任意非字母或數(shù)字的字符) 表示字符 x。 這是對魔法字符轉(zhuǎn)義的標(biāo)準(zhǔn)方法。 所有非字母或數(shù)字的字符 (包括所有標(biāo)點,也包括非魔法字符) 都可以用前置一個 '%' 放在模式串中表示自身。

  • **[set]: **表示 set 中所有字符的聯(lián)合。 可以以 '-' 連接,升序書寫范圍兩端的字符來表示一個范圍的字符集。 上面提到的 %x 形式也可以在 set 中使用 表示其中的一個元素。 其它出現(xiàn)在 set 中的字符則代表它們自己。 例如,[%w_] (或 [_%w]) 表示所有的字母數(shù)字加下劃線), [0-7] 表示 8 進(jìn)制數(shù)字, [0-7%l%-] 表示 8 進(jìn)制數(shù)字加小寫字母與 '-' 字符。

    交叉使用類和范圍的行為未定義。 因此,像 [%a-z] 或 [a-%%] 這樣的模式串沒有意義。

  • **[^set]: **表示 set 的補集, 其中 set 如上面的解釋。

所有單個字母表示的類別(%a,%c,等), 若將其字母改為大寫,均表示對應(yīng)的補集。 例如,%S 表示所有非空格的字符。

如何定義字母、空格、或是其他字符組取決于當(dāng)前的區(qū)域設(shè)置。 特別注意:[a-z] 未必等價于 %l 。

模式條目:

模式條目 可以是

  • 單個字符類匹配該類別中任意單個字符;
  • 單個字符類跟一個 '', 將匹配零或多個該類的字符。 這個條目總是匹配盡可能長的串*;
  • 單個字符類跟一個 '+', 將匹配一或更多個該類的字符。 這個條目總是匹配盡可能長的串;
  • 單個字符類跟一個 '-', 將匹配零或更多個該類的字符。 和 '' 不同, 這個條目總是匹配盡可能短的串*;
  • 單個字符類跟一個 '?', 將匹配零或一個該類的字符。 只要有可能,它會匹配一個;
  • %n, 這里的 n 可以從 1 到 9; 這個條目匹配一個等于 n 號捕獲物(后面有描述)的子串。
  • %b_xy_, 這里的 xy 是兩個明確的字符; 這個條目匹配以 x 開始 y 結(jié)束, 且其中 xy 保持 平衡 的字符串。 意思是,如果從左到右讀這個字符串,對每次讀到一個 x+1 ,讀到一個 y-1, 最終結(jié)束處的那個y 是第一個記數(shù)到 0 的 y。 舉個例子,條目 %b() 可以匹配到括號平衡的表達(dá)式。
  • %f[set], 指 邊境模式; 這個條目會匹配到一個位于 set 內(nèi)某個字符之前的一個空串, 且這個位置的前一個字符不屬于 set 。 集合 set 的含義如前面所述。 匹配出的那個空串之開始和結(jié)束點的計算就看成該處有個字符 '\0' 一樣。

模式:

模式 指一個模式條目的序列。 在模式最前面加上符號 '^' 將錨定從字符串的開始處做匹配。 在模式最后面加上符號 '$' 將使匹配過程錨定到字符串的結(jié)尾。 如果 '^' 和 '$' 出現(xiàn)在其它位置,它們均沒有特殊含義,只表示自身。

捕獲:

模式可以在內(nèi)部用小括號括起一個子模式; 這些子模式被稱為 捕獲物。 當(dāng)匹配成功時,由 捕獲物 匹配到的字符串中的子串被保存起來用于未來的用途。 捕獲物以它們左括號的次序來編號。 例如,對于模式 "(a(.)%w(%s))" , 字符串中匹配到 "a(.)%w(%s)" 的部分保存在第一個捕獲物中 (因此是編號 1 ); 由 "." 匹配到的字符是 2 號捕獲物, 匹配到 "%s*" 的那部分是 3 號。

作為一個特例,空的捕獲 () 將捕獲到當(dāng)前字符串的位置(它是一個數(shù)字)。 例如,如果將模式 "()aa()" 作用到字符串 "flaaap" 上,將產(chǎn)生兩個捕獲物: 3 和 5 。

參考鏈接:http://cloudwu.github.io/lua53doc/manual.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,688評論 19 139
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,690評論 0 4
  • Lua Lpeg 用基本匹配函數(shù),組合匹配表達(dá)式 所有匹配函數(shù)返回userdata類型,是一個匹配模式(以下用pa...
    EternalSunLhx閱讀 14,046評論 1 3
  • 體裁:小說 推薦指數(shù):兩顆星 有沒有因為一件漂亮的衣服,而想要讓自己更瘦一點? 有沒有因為一束花,而想去美容或者是...
    鐘貝拉閱讀 393評論 0 1
  • 今天是9月15號,是星期五。 今天我們按周來計算已經(jīng)開學(xué)兩周了。今天我們舉行了學(xué)校初一年級C段班的三跳運動會。我們...
    山榛隰苓閱讀 235評論 0 0

友情鏈接更多精彩內(nèi)容