一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語(yǔ)言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Lua - Lua字符串庫(kù)中的幾個(gè)重點(diǎn)函數(shù)介紹

Lua字符串庫(kù)中的幾個(gè)重點(diǎn)函數(shù)介紹

2020-04-14 10:52果凍想 Lua

這篇文章主要介紹了Lua字符串庫(kù)中的幾個(gè)重點(diǎn)函數(shù)介紹,本文講解了幾個(gè)最常用的強(qiáng)大的字符串函數(shù)find、match、gsub、gmatch,需要的朋友可以參考下

在《Lua中的一些庫(kù)》中也說(shuō)到了,要對(duì)string庫(kù)的模式匹配進(jìn)行單獨(dú)的講解。對(duì)于字符串的處理,對(duì)于任何語(yǔ)言的學(xué)習(xí)來(lái)說(shuō),都是一個(gè)難點(diǎn),而且也是一個(gè)必會(huì)的知識(shí)點(diǎn)。給你一個(gè)字符串,讓你按照某種需求進(jìn)行處理,你不會(huì),那是多么尷尬的一件事情。所以,看完《Lua中的一些庫(kù)》和這篇文章之后,我爭(zhēng)取做到讓你在處理字符串時(shí),不再感到捉襟見(jiàn)肘,不再尷尬。

說(shuō)到Lua中的模式匹配,基本上就是圍繞著以下幾個(gè)函數(shù)展開(kāi)的:

1.find;
2.match;
3.gsub;
4.gmatch。

我的總結(jié)也就是圍繞著上面的四個(gè)函數(shù)展開(kāi)的。請(qǐng)容我慢慢道來(lái)。

簡(jiǎn)單實(shí)用的find

string.find()函數(shù)用于在一個(gè)給定的目標(biāo)字符串中搜索一個(gè)模式。最簡(jiǎn)單的模式就是一個(gè)單詞,它只會(huì)匹配與自己完全相同的拷貝。當(dāng)find找到一個(gè)模式后,它會(huì)返回兩個(gè)值:匹配到的起始索引和結(jié)尾索引;如果沒(méi)有找到任何匹配,它就返回nil。示例代碼:

 

復(fù)制代碼 代碼如下:

local str = "Hello World"
local i, j = string.find(str, "Hello") -- 返回Hello在str中的起始位置和終止位置
print(i, j)


string.find函數(shù)還具有一個(gè)可選的第三個(gè)參數(shù),它是一個(gè)索引,告訴函數(shù)應(yīng)該從目標(biāo)字符串的哪個(gè)位置開(kāi)始搜索。當(dāng)我們處理一個(gè)字符串中與給定模式相匹配的所以內(nèi)容時(shí),這個(gè)設(shè)置是非常有用的。我們可以循環(huán)的進(jìn)行查找操作。當(dāng)然了,這里只是說(shuō)了最普通,也是最簡(jiǎn)單的一種方式,對(duì)于第二個(gè)參數(shù),我們完全可以傳遞一個(gè)正則表達(dá)式,也就是一個(gè)pattern,進(jìn)行正則匹配。示例代碼:

 

 

復(fù)制代碼 代碼如下:

local str = "Hello12345World"
local i, j = string.find(str, "%d+")
print(i, j) -- 6   10

 

find的兄弟match

函數(shù)string.match與string.find非常相似,它也是用于在一個(gè)字符串中搜索一種模式。區(qū)別在于,string.match返回的是目標(biāo)字符串中與模式相匹配的那部分子串,并不是該模式所在的位置。示例代碼:

 

復(fù)制代碼 代碼如下:

local str = "Hello12345World"
local subStr = string.match(str, "%d+")
print(subStr)
 
local i, j =string.find(str, "%d+")
subStr =string.sub(str, i, j)
print(subStr)
 
-- 是不是可以認(rèn)為match等于find + sub呢?


match和find是如此的相近,因此,在實(shí)際開(kāi)發(fā)中,按照實(shí)際的需要,決定采用哪個(gè)。

 

替換利器gsub

string.gsub有3個(gè)參數(shù):目標(biāo)字符串、模式和替換字符串。它的基本用法是將目標(biāo)字符串中所有出現(xiàn)模式的地方替換為目標(biāo)字符串。來(lái)看一段簡(jiǎn)短的代碼,就什么都明白了。

復(fù)制代碼 代碼如下:

local str = "Hello World"
local strResult = string.gsub(str, "Hello", "Jelly")
print(strResult) -- Jelly World


另外gsub還有可選的第四個(gè)參數(shù),可以限制替換的次數(shù)。示例代碼如下:

 

 

復(fù)制代碼 代碼如下:

local str = "Hello World"
 
-- 這里不限制替換次數(shù)
local strResult, cnt = string.gsub(str, "l", "o")
print(strResult) -- Heooo Worod
print(cnt) -- 實(shí)際替換的次數(shù)
 
-- 開(kāi)始限制替換次數(shù)
strResult, cnt = string.gsub(str, "l", "o", 1)
print(strResult) -- Heolo World
print(cnt) -- 就替換了一次


這里還有重點(diǎn)需要介紹,也就是gsub的強(qiáng)大之處。先看一段代碼,然后再做介紹。

復(fù)制代碼 代碼如下:

local replaceTb = {hello = "Jelly", world = "Think"}
 
local str = "hello world"
 
-- 注意,第3個(gè)參數(shù)是一個(gè)table
local strResult = string.gsub(str, "hello", replaceTb)
print(strResult) -- Jelly world
 
strResult = string.gsub(strResult, "world", replaceTb)
print(strResult) -- Jelly Think
 
strResult = string.gsub(strResult, "hello", replaceTb)
print(strResult) -- Jelly Think


可以看到,gsub的第三個(gè)參數(shù)是一個(gè)table,也就是說(shuō),當(dāng)gsub的第三個(gè)參數(shù)是一個(gè)table時(shí),如果在查找的字符串中有與第二個(gè)參數(shù)相匹配的內(nèi)容,就會(huì)將該內(nèi)容作為key,在table中查找該key對(duì)應(yīng)的value;如果該table中沒(méi)有這個(gè)key,則不進(jìn)行替換;上面的代碼就是表明這個(gè)意思。接下來(lái)再來(lái)看一段比較神奇的代碼:

復(fù)制代碼 代碼如下:

local replaceFunc = function (str)
    return str .. "JellyThink"
end
local str = "hello world"
-- 注意,第3個(gè)參數(shù)是一個(gè)table
local strResult = string.gsub(str, "hello", replaceFunc)
print(strResult) -- helloJellyThink world

 

沒(méi)有看錯(cuò),gsub的第三個(gè)參數(shù)還可以是一個(gè)函數(shù),該函數(shù)的參數(shù)是被匹配的字符串,該函數(shù)的返回值將會(huì)作為目標(biāo)字符串去進(jìn)行替換匹配的內(nèi)容。

沒(méi)法形容的gmatch

我也不知道要怎么形容gmatch,gmatch會(huì)返回一個(gè)迭代器函數(shù),你可以使用這個(gè)迭代器函數(shù)去迭代匹配的所有內(nèi)容。看下列代碼:

復(fù)制代碼 代碼如下:

local str = "Hello World"
local iteratorFunc = string.gmatch(str, "%a+") -- %a+表示匹配所有單詞
 
for i in iteratorFunc do
    print(i)
end

 

如果你對(duì)迭代器還不熟悉的話,可以看這里。我現(xiàn)在就使用find來(lái)實(shí)現(xiàn)一個(gè)我們自己的gmatch,功能和gmatch是差不多的。代碼如下:

 

復(fù)制代碼 代碼如下:

local str = "Hello World"
 
-- 使用find來(lái)實(shí)現(xiàn)一個(gè)自己的gmatch
local myGmatch = function (s, pattern)
  local resultTb = {} -- 相當(dāng)于迭代器中的恒定狀態(tài)
  local index = 0 -- 相當(dāng)于迭代器中的控制變量
 
  local i, j = string.find(s, pattern)
  while i do
    resultTb[#resultTb + 1] = string.sub(s, i, j)
    i, j = string.find(s, pattern, j + 1)
  end
 
  return function () -- 返回一個(gè)迭代器函數(shù)
    index = index + 1
    return resultTb[index]
  end
end
 
for i in myGmatch(str, "%a+") do
  print(i)
end

 

總結(jié)

這里就總結(jié)到這里了,這篇文章很詳細(xì)的幾個(gè)字符串庫(kù)中我認(rèn)為比較重要的函數(shù)。我想我已經(jīng)總結(jié)的很詳細(xì)了,寫(xiě)了那么多的示例代碼,應(yīng)該還好理解。就這樣了。希望對(duì)大家有用。最后,我希望大家也和我一起分享,分享你的學(xué)習(xí)心得,分享你的IT人生,期待。。。

延伸 · 閱讀

精彩推薦
  • LuaLua中計(jì)算、執(zhí)行字符串中Lua代碼的方法

    Lua中計(jì)算、執(zhí)行字符串中Lua代碼的方法

    這篇文章主要介紹了Lua中計(jì)算、執(zhí)行字符串中Lua代碼的方法,類似JavaScript中eval函數(shù)的功能,在Lua中也可以實(shí)現(xiàn),需要的朋友可以參考下 ...

    腳本之家6322020-04-30
  • LuaLua教程(二):基礎(chǔ)知識(shí)、類型與值介紹

    Lua教程(二):基礎(chǔ)知識(shí)、類型與值介紹

    這篇文章主要介紹了Lua教程(二):基礎(chǔ)知識(shí)、類型與值介紹,本文講解了Hello World程序、代碼規(guī)范、全局變量、類型與值等內(nèi)容,需要的朋友可以參考下 ...

    腳本之家5922020-04-28
  • LuaLua中table庫(kù)函數(shù)方法介紹

    Lua中table庫(kù)函數(shù)方法介紹

    這篇文章主要介紹了Lua中table庫(kù)函數(shù)方法介紹,本文講解了concat、insert、maxn、remove、sort、foreachi等方法,需要的朋友可以參考下 ...

    腳本之家2502020-04-17
  • LuaLua和C語(yǔ)言的交互詳解

    Lua和C語(yǔ)言的交互詳解

    這篇文章主要介紹了Lua和C語(yǔ)言的交互詳解,Lua和C語(yǔ)言通過(guò)棧完成交互,本文結(jié)合代碼實(shí)例詳細(xì)講解了交互的方法,需要的朋友可以參考下 ...

    果凍想3702020-04-14
  • Lua深入探究Lua中的解析表達(dá)式

    深入探究Lua中的解析表達(dá)式

    這篇文章主要介紹了深入探究Lua中的解析表達(dá)式,對(duì)于其語(yǔ)法部分的說(shuō)明和示例都超詳細(xì),極力推薦此文!需要的朋友可以參考下 ...

    腳本之家3542020-05-05
  • LuaLua實(shí)現(xiàn)__add方法重載示例

    Lua實(shí)現(xiàn)__add方法重載示例

    這篇文章主要介紹了Lua實(shí)現(xiàn)__add方法重載示例,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下 ...

    腳本之家7452020-04-24
  • LuaLua中的元方法__newindex詳解

    Lua中的元方法__newindex詳解

    這篇文章主要介紹了Lua中的元方法__newindex詳解,本文講解了查詢與更新、監(jiān)控賦值、通過(guò)table給另一個(gè)table賦值等內(nèi)容,需要的朋友可以參考下 ...

    笨木頭8872020-04-09
  • LuaLua簡(jiǎn)介、編譯安裝教程及變量等語(yǔ)法介紹

    Lua簡(jiǎn)介、編譯安裝教程及變量等語(yǔ)法介紹

    這篇文章主要介紹了Lua簡(jiǎn)介、編譯安裝教程及變量等語(yǔ)法介紹,本文同時(shí)講解了lua注釋語(yǔ)法、Lua命令行方式等內(nèi)容,需要的朋友可以參考下 ...

    junjie3632020-04-14
主站蜘蛛池模板: 日韩视频在线免费观看 | 亚洲精品视频导航 | 苍井空av | 午夜在线a亚洲v天堂网2019 | a级毛片毛片免费很很综合 a级黄色视屏 | 翁用力的抽插 | 国产好痛疼轻点好爽的视频 | 青草视频在线观看免费网站 | 亚洲国产成人99精品激情在线 | 亚洲a视频在线 | 视频在线观看国产 | 免费看60分钟大片视频播放 | 校花的第一次好紧好爽 | 欧美一级高清片 | 亚洲国产成人精品激情 | 亚洲精品成人AV在线观看爽翻 | 日韩国产成人精品视频 | 国内精品视频九九九九 | 亚洲精品午夜级久久久久 | 狠狠夜夜久久日日91av | 免费又爽又黄禁片视频在线播放 | 日本人护士免费xxxx视频 | 日本68xxxxxxxxx24| 香蕉成人国产精品免费看网站 | jux539原千岁在线播放 | 国产一卡2卡3卡四卡精品网站 | 翁公与小莹在客厅激情 | 美女的隐私视频免费看软件 | 男人操女人动图 | 国产日本免费 | 亚洲成年人在线观看 | 色一情一区二区三区四区 | 亚洲欧美久久婷婷爱综合一区天堂 | 久久久久久久久女黄9999 | 99热国产在线观看 | 隔壁的漂亮邻居hd中文 | 欧美日韩在线一区二区三区 | 免费看男女做好爽好硬视频 | 糖心vlog视频永久破解版 | 粉嫩极品国产在线观看免费 | 乌克兰少妇大胆大BBW |