openresty开发系列18--lua的字符串string操作
openresty開(kāi)發(fā)系列18--lua的字符串string操作
string的相關(guān)操作
1)string.upper(s)
接收一個(gè)字符串 s,返回一個(gè)把所有小寫字母變成大寫字母的字符串。
print(string.upper("Hello Lua"))? -->output? HELLO LUA
2)string.lower(s)
接收一個(gè)字符串 s,返回一個(gè)把所有大寫字母變成小寫字母的字符串。
print(string.lower("Hello Lua"))? -->output?? hello lua
3)string.len(s)
接收一個(gè)字符串,返回它的長(zhǎng)度
print(string.len("hello lua")) -->output? 9
使用此函數(shù)是不推薦的。推薦使用 # 運(yùn)算符來(lái)獲取 Lua 字符串的長(zhǎng)度。
print(#("hello lua")) -->output? 9
由于 Lua 字符串的長(zhǎng)度是專門存放的,并不需要像 C 字符串那樣即時(shí)計(jì)算
因此獲取字符串長(zhǎng)度的操作總是 O(1) 的時(shí)間復(fù)雜度。
4)string.find(s, p [, init [, plain]]) --查找子字符串
在 s 字符串中第一次匹配 p 字符串。若匹配成功,則返回 p 字符串中出現(xiàn)的開(kāi)始位置和結(jié)束位置;
若匹配失敗,則返回 nil。
第三個(gè)參數(shù) init 默認(rèn)為 1,并且可以為負(fù)整數(shù),
當(dāng) init 為負(fù)數(shù)時(shí),表示從后往前數(shù)的字符個(gè)數(shù);再?gòu)拇怂饕庨_(kāi)始向后匹配字符串 p 。
第四個(gè)參數(shù)默認(rèn)為 false,當(dāng)其為 true 時(shí),關(guān)閉模式匹配;只會(huì)把 p 看成一個(gè)字符串對(duì)待。
local find = string.find
print(find("abc cba", "ab"))
print(find("abc cba", "ab", 2))?? ?
print(find("abc cba", "ba", -1))?? ?
print(find("abc cba", "ba", -3))
-->output
1?? 2
nil
nil
6?? 7
模式匹配--lua正則表達(dá)式
local s = "am+df"
print(string.find(s, "m+", 1, false))??? -- 2??? 2、
其中字符 + 在 Lua 正則表達(dá)式中的意思是匹配在它之前的那個(gè)字符一次或者多次,
也就是說(shuō) m+ 在正則表達(dá)式里會(huì)去匹配 m, mm, mmm ……。
print(string.find(s, "m+", 1, true))??? -- 2??? 3
plain為true,關(guān)閉了模式匹配,p參數(shù)也就是"m+",當(dāng)做了是個(gè)普通字符串,不進(jìn)行模式匹配
5)string.format(formatstring, ...) --格式化輸出
按照格式化參數(shù) formatstring,返回后面 ... 內(nèi)容的格式化版本。
編寫格式化字符串的規(guī)則與標(biāo)準(zhǔn) c 語(yǔ)言中 printf 函數(shù)的規(guī)則基本相同:
它由常規(guī)文本和指示組成,這些指示控制了每個(gè)參數(shù)應(yīng)放到格式化結(jié)果的什么位置,及如何放入它們
一個(gè)指示由字符 % 加上一個(gè)字母組成,這些字母指定了如何格式化參數(shù),
例如 d 用于十進(jìn)制數(shù)、x 用于十六進(jìn)制數(shù)、o 用于八進(jìn)制數(shù)、f 用于浮點(diǎn)數(shù)、s 用于字符串等。
在字符 % 和字母之間可以再指定一些其他選項(xiàng),用于控制格式的細(xì)節(jié)。
print(string.format("%.4f", 3.1415926))???? -- 保留4位小數(shù)
print(string.format("%d %x %o", 31, 31, 31))-- 十進(jìn)制數(shù)31轉(zhuǎn)換成不同進(jìn)制
d = 29; m = 7; y = 2015???????????????????? -- 一行包含幾個(gè)語(yǔ)句,用;分開(kāi)
print(string.format("%s %02d/%02d/%d", "today is:", d, m, y))
-->output
3.1416
31 1f 37
today is: 29/07/2015
6)整型數(shù)字 與 字符互換
Lua 字符串總是由字節(jié)構(gòu)成的。下標(biāo)是從 1 開(kāi)始的,這不同于像 C 和 Perl
string.byte(s [, i [, j ]])
返回字符 s[i]、s[i + 1]、s[i + 2]、······、s[j] 所對(duì)應(yīng)的 ASCII 碼。
i 的默認(rèn)值為 1,即第一個(gè)字節(jié);j 的默認(rèn)值為 i
print(string.byte("abc", 1, 3))
print(string.byte("abc", 3)) -- 缺少第三個(gè)參數(shù),第三個(gè)參數(shù)默認(rèn)與第二個(gè)相同,此時(shí)為 3
print(string.byte("abc"))??? -- 缺少第二個(gè)和第三個(gè)參數(shù),此時(shí)這兩個(gè)參數(shù)都默認(rèn)為 1
-->output
97? 98? 99
99
97
由于 string.byte 只返回整數(shù),而并不像 string.sub 等函數(shù)那樣(嘗試)創(chuàng)建新的 Lua 字符串,
因此使用 string.byte 來(lái)進(jìn)行字符串相關(guān)的掃描和分析是最為高效的,尤其是在被 LuaJIT 2 所 JIT 編譯之后。
string.char (...)
接收 0 個(gè)或更多的整數(shù)(整數(shù)范圍:0~255),返回這些整數(shù)所對(duì)應(yīng)的 ASCII 碼字符組成的字符串。
當(dāng)參數(shù)為空時(shí),默認(rèn)是一個(gè) 0。
print(string.char(96, 97, 98))
print(string.char())??????? -- 參數(shù)為空,默認(rèn)是一個(gè)0,
??????????????????????????? -- 你可以用string.byte(string.char())測(cè)試一下
print(string.char(65, 66))
--> output
`ab
AB
如果你只是想對(duì)字符串中的單個(gè)字節(jié)進(jìn)行檢查,使用 string.char 函數(shù)通常會(huì)更為高效。
7)string.match(s, p [, init])--匹配子字符串
在字符串 s 中匹配(模式)字符串 p,若匹配成功,則返回目標(biāo)字符串中與模式匹配的子串;否則返回 nil。
第三個(gè)參數(shù) init 默認(rèn)為 1,并且可以為負(fù)整數(shù),
當(dāng) init 為負(fù)數(shù)時(shí),表示從后往前數(shù)的字符個(gè)數(shù),在此索引處開(kāi)始向后匹配字符串 p。
print(string.match("hello lua", "lua"))
print(string.match("lua lua", "lua", 2))? --匹配后面那個(gè)lua
print(string.match("lua lua", "hello"))
print(string.match("today is 27/7/2015", "%d+/%d+/%d+"))
-->output
lua
lua
nil
27/7/2015
string.match 目前并不能被 JIT 編譯,應(yīng) 盡量 使用 ngx_lua 模塊提供的 ngx.re.match 等接口。
8)string.gmatch(s, p) --匹配多個(gè)字符串
返回一個(gè)迭代器函數(shù),通過(guò)這個(gè)迭代器函數(shù)可以遍歷到在字符串 s 中出現(xiàn)模式串 p 的所有地方。
s = "hello world from Lua"
for w in string.gmatch(s, "%a+") do? --匹配最長(zhǎng)連續(xù)且只含字母的字符串
??? print(w)
end
-->output
hello
world
from
Lua
t = {}
s = "from=world, to=Lua"
for k, v in string.gmatch(s, "(%a+)=(%a+)") do? --匹配兩個(gè)最長(zhǎng)連續(xù)且只含字母的
??? t[k] = v??????????????????????????????????? --字符串,它們之間用等號(hào)連接
end
for k, v in pairs(t) do
print (k,v)
end
-->output
to????? Lua
from??? world
此函數(shù)目前并不能被 LuaJIT 所 JIT 編譯,而只能被解釋執(zhí)行。應(yīng) 盡量 使用 ngx_lua 模塊提供的 ngx.re.gmatch 等接口。
9)string.rep(s, n) --字符串拷貝
返回字符串 s 的 n 次拷貝。
print(string.rep("abc", 3)) --拷貝3次"abc"
-->output? abcabcabc
10)string.sub(s, i [, j]) --截取子字符串
返回字符串 s 中,索引 i 到索引 j 之間的子字符串。當(dāng) j 缺省時(shí),默認(rèn)為 -1,也就是字符串 s 的最后位置。
i 可以為負(fù)數(shù)。當(dāng)索引 i 在字符串 s 的位置在索引 j 的后面時(shí),將返回一個(gè)空字符串。
print(string.sub("Hello Lua", 4, 7))
print(string.sub("Hello Lua", 2))
print(string.sub("Hello Lua", 2, 1))??? --看到返回什么了嗎
print(string.sub("Hello Lua", -3, -1))
-->output
lo L
ello Lua
Lua
11)string.gsub(s, p, r [, n]) --替換子字符串
將目標(biāo)字符串 s 中所有的子串 p 替換成字符串r。可選參數(shù)n,表示限制替換次數(shù)。
返回值有兩個(gè),第一個(gè)是被替換后的字符串,第二個(gè)是替換了多少次。
print(string.gsub("Lua Lua Lua", "Lua", "hello"))
print(string.gsub("Lua Lua Lua", "Lua", "hello", 2)) --指明第四個(gè)參數(shù)
-->output
hello hello hello?? 3
hello hello Lua???? 2
此函數(shù)不能為 LuaJIT 所 JIT 編譯,而只能被解釋執(zhí)行。一般我們推薦使用 ngx_lua 模塊提供的 ngx.re.gsub 函數(shù)。
12)string.reverse (s) --反轉(zhuǎn)
接收一個(gè)字符串 s,返回這個(gè)字符串的反轉(zhuǎn)。
print(string.reverse("Hello Lua"))? --> output: auL olleH
轉(zhuǎn)載于:https://www.cnblogs.com/reblue520/p/11433474.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的openresty开发系列18--lua的字符串string操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 通过Java执行python文件
- 下一篇: openresty开发系列19--lua