日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Lua string库整理

發(fā)布時(shí)間:2025/7/14 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Lua string库整理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

string庫提供了字符串處理的通用函數(shù)。 例如字符串查找、子串、模式匹配等。 當(dāng)在 Lua 中對字符串做索引時(shí),第一個(gè)字符從 1 開始計(jì)算(而不是 C 里的 0 )。 索引可以是負(fù)數(shù),它指從字符串末尾反向解析。 即,最后一個(gè)字符在 -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ù)量相同長度的字符串。 其中每個(gè)字符的內(nèi)部編碼值等于對應(yīng)的參數(shù)值。

print(string.char(98, 99, 100)) Output: bcd

string.dump(function)

返回包含有以二進(jìn)制方式表示的(一個(gè)?二進(jìn)制代碼塊?)指定函數(shù)的字符串。 之后可以用 loadstring 調(diào)用這個(gè)字符串獲得 該函數(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]])

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

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

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ù)的格式化版本, 格式化串為第一個(gè)參數(shù)(必須是一個(gè)字符串)。 格式化字符串遵循 ISO C 函數(shù) sprintf 的規(guī)則。 不同點(diǎn)在于選項(xiàng) *, h, L, l, n, p 不支持, 另外還增加了一個(gè)選項(xiàng) q。 q 選項(xiàng)將一個(gè)字符串格式化為兩個(gè)雙引號括起,對內(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 都期待一個(gè)對應(yīng)的數(shù)字參數(shù)。 選項(xiàng) c, d, i, o, u, X, and x 則期待一個(gè)整數(shù)。 選項(xiàng) q 期待一個(gè)字符串; 選項(xiàng) s 期待一個(gè)沒有內(nèi)嵌零的字符串。

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

string.gmatch(s, pattern)

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

對這個(gè)函數(shù)來說,模板前開始的 '^' 不會當(dāng)成錨點(diǎn)。因?yàn)檫@樣會阻止迭代。

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 給出時(shí)的前 n 個(gè)) pattern 都替換成 repl ,并返回其副本。 repl 可以是字符串、表、或函數(shù)。 gsub 還會在第二個(gè)返回值返回一共發(fā)生了多少次匹配。 gsub 這個(gè)名字來源于?Global SUBstitution?。

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

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

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

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

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

-- 匹配字符轉(zhuǎn) -- 先匹配hello, %1 為匹配值, 將hello 替換為hello hello -- 匹配world時(shí) 同理 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)

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

print(string.len("hello world \0")) Output: 13

string.lower(s)

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

print(string.lower("HeLLo World"))Output: hello world

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

在字符串 s 中找到第一個(gè)能用 pattern匹配到的部分。 如果能找到,match 返回其中的捕獲物; 否則返回?nil?。 如果 pattern 中未指定捕獲, 返回整個(gè) pattern 捕獲到的串。 第三個(gè)可選數(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個(gè)字符串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)

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

print(string.upper("Hello World"))Output: HELLO WORLD

匹配模式

字符類:

字符類?用于表示一個(gè)字符集合。 下列組合可用于字符類:

  • x:?(這里?x?不能是?魔法字符?^$()%.[]*+-? 中的一員) 表示字符?x?自身。
  • .:?(一個(gè)點(diǎn))可表示任何字符。
  • %a:?表示任何字母。
  • %c:?表示任何控制字符。
  • %d:?表示任何數(shù)字。
  • %g:?表示任何除空白符外的可打印字符。
  • %l:?表示所有小寫字母。
  • %p:?表示所有標(biāo)點(diǎn)符號。
  • %s:?表示所有空白字符。
  • %u:?表示所有大寫字母。
  • %w:?表示所有字母及數(shù)字。
  • %x:?表示所有 16 進(jìn)制數(shù)字符號。
  • %x:?(這里的?x?是任意非字母或數(shù)字的字符) 表示字符?x。 這是對魔法字符轉(zhuǎn)義的標(biāo)準(zhǔn)方法。 所有非字母或數(shù)字的字符 (包括所有標(biāo)點(diǎn),也包括非魔法字符) 都可以用前置一個(gè) '%' 放在模式串中表示自身。
  • [set]:?表示?set 中所有字符的聯(lián)合。 可以以 '-' 連接,升序書寫范圍兩端的字符來表示一個(gè)范圍的字符集。 上面提到的 %x形式也可以在?set?中使用 表示其中的一個(gè)元素。 其它出現(xiàn)在?set?中的字符則代表它們自己。 例如,[%w_] (或 [_%w]) 表示所有的字母數(shù)字加下劃線), [0-7] 表示 8 進(jìn)制數(shù)字, [0-7%l%-] 表示 8 進(jìn)制數(shù)字加小寫字母與 '-' 字符。

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

  • [^set]:?表示?set?的補(bǔ)集, 其中?set?如上面的解釋。

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

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

模式條目:

模式條目?可以是

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

模式:

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

捕獲:

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

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

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

轉(zhuǎn)載于:https://www.cnblogs.com/DeeLMind/p/7110943.html

總結(jié)

以上是生活随笔為你收集整理的Lua string库整理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。