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

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

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

服務器之家 - 腳本之家 - Lua - Lua字符串庫中的幾個重點函數介紹

Lua字符串庫中的幾個重點函數介紹

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

這篇文章主要介紹了Lua字符串庫中的幾個重點函數介紹,本文講解了幾個最常用的強大的字符串函數find、match、gsub、gmatch,需要的朋友可以參考下

在《Lua中的一些庫》中也說到了,要對string庫的模式匹配進行單獨的講解。對于字符串的處理,對于任何語言的學習來說,都是一個難點,而且也是一個必會的知識點。給你一個字符串,讓你按照某種需求進行處理,你不會,那是多么尷尬的一件事情。所以,看完《Lua中的一些庫》和這篇文章之后,我爭取做到讓你在處理字符串時,不再感到捉襟見肘,不再尷尬。

說到Lua中的模式匹配,基本上就是圍繞著以下幾個函數展開的:

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

我的總結也就是圍繞著上面的四個函數展開的。請容我慢慢道來。

簡單實用的find

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

 

復制代碼 代碼如下:

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


string.find函數還具有一個可選的第三個參數,它是一個索引,告訴函數應該從目標字符串的哪個位置開始搜索。當我們處理一個字符串中與給定模式相匹配的所以內容時,這個設置是非常有用的。我們可以循環的進行查找操作。當然了,這里只是說了最普通,也是最簡單的一種方式,對于第二個參數,我們完全可以傳遞一個正則表達式,也就是一個pattern,進行正則匹配。示例代碼:

 

 

復制代碼 代碼如下:

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

 

find的兄弟match

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

 

復制代碼 代碼如下:

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)
 
-- 是不是可以認為match等于find + sub呢?


match和find是如此的相近,因此,在實際開發中,按照實際的需要,決定采用哪個。

 

替換利器gsub

string.gsub有3個參數:目標字符串、模式和替換字符串。它的基本用法是將目標字符串中所有出現模式的地方替換為目標字符串。來看一段簡短的代碼,就什么都明白了。

復制代碼 代碼如下:

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


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

 

 

復制代碼 代碼如下:

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


這里還有重點需要介紹,也就是gsub的強大之處。先看一段代碼,然后再做介紹。

復制代碼 代碼如下:

local replaceTb = {hello = "Jelly", world = "Think"}
 
local str = "hello world"
 
-- 注意,第3個參數是一個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的第三個參數是一個table,也就是說,當gsub的第三個參數是一個table時,如果在查找的字符串中有與第二個參數相匹配的內容,就會將該內容作為key,在table中查找該key對應的value;如果該table中沒有這個key,則不進行替換;上面的代碼就是表明這個意思。接下來再來看一段比較神奇的代碼:

復制代碼 代碼如下:

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

 

沒有看錯,gsub的第三個參數還可以是一個函數,該函數的參數是被匹配的字符串,該函數的返回值將會作為目標字符串去進行替換匹配的內容。

沒法形容的gmatch

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

復制代碼 代碼如下:

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

 

如果你對迭代器還不熟悉的話,可以看這里。我現在就使用find來實現一個我們自己的gmatch,功能和gmatch是差不多的。代碼如下:

 

復制代碼 代碼如下:

local str = "Hello World"
 
-- 使用find來實現一個自己的gmatch
local myGmatch = function (s, pattern)
  local resultTb = {} -- 相當于迭代器中的恒定狀態
  local index = 0 -- 相當于迭代器中的控制變量
 
  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 () -- 返回一個迭代器函數
    index = index + 1
    return resultTb[index]
  end
end
 
for i in myGmatch(str, "%a+") do
  print(i)
end

 

總結

這里就總結到這里了,這篇文章很詳細的幾個字符串庫中我認為比較重要的函數。我想我已經總結的很詳細了,寫了那么多的示例代碼,應該還好理解。就這樣了。希望對大家有用。最后,我希望大家也和我一起分享,分享你的學習心得,分享你的IT人生,期待。。。

延伸 · 閱讀

精彩推薦
  • LuaLua中計算、執行字符串中Lua代碼的方法

    Lua中計算、執行字符串中Lua代碼的方法

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

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

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

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

    腳本之家5922020-04-28
  • LuaLua中table庫函數方法介紹

    Lua中table庫函數方法介紹

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

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

    Lua和C語言的交互詳解

    這篇文章主要介紹了Lua和C語言的交互詳解,Lua和C語言通過棧完成交互,本文結合代碼實例詳細講解了交互的方法,需要的朋友可以參考下 ...

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

    深入探究Lua中的解析表達式

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

    腳本之家3542020-05-05
  • LuaLua實現__add方法重載示例

    Lua實現__add方法重載示例

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

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

    Lua中的元方法__newindex詳解

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

    笨木頭8872020-04-09
  • LuaLua簡介、編譯安裝教程及變量等語法介紹

    Lua簡介、編譯安裝教程及變量等語法介紹

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

    junjie3632020-04-14
主站蜘蛛池模板: 99视频有精品视频免费观看 | 国产欧美综合一区二区 | 欧美日韩国产成人精品 | 免费在线观看日本 | 男人搡女人视频免费看 | 96av视频在线观看 | 四虎播放器 | 女主被当众调教虐np | 日本五十路六十30人8时间 | 久久精品久久久久 | 视频一区二区三区在线 | 俄罗斯一级大片 | boobsmilking流奶水 | 日本大片网 | 热久久亚洲 | 国产精品久久香蕉免费播放 | 吃瓜视频在线观看 | 5g影院天天爽爽 | 久久精品麻豆国产天美传媒果冻 | 91制片厂制作传媒破解版免费 | 小仙夜晚慰自催眠mp3护士篇 | 高清视频一区二区三区 | 红楼梦黄色小说 | 秋霞黄色网 | 男女激情视频1000辣妞范 | 国产大秀视频一区二区三区 | 咪咪爱在线视频 | 激情三级做爰在线观看激情 | 日韩精品视频美在线精品视频 | 日本精品中文字幕在线播放 | 成年人免费观看的视频 | 青青久在线视频免费观看 | 欧洲美女bbbxxxxxx | 亚洲精品一区二区三区中文字幕 | 国内精品露脸在线视频播放 | 亚洲欧美日韩中文字幕网址 | 女人用粗大自熨喷水在线视频 | 久久免费观看视频 | 国产日本久久久久久久久婷婷 | 艾秋麻豆果冻剧传媒在线播放 | 亚洲看片lutube在线入口 |