最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Lua字符串庫中的幾個重點函數(shù)介紹

 更新時間:2014年09月29日 12:25:45   作者:果凍想  
這篇文章主要介紹了Lua字符串庫中的幾個重點函數(shù)介紹,本文講解了幾個最常用的強大的字符串函數(shù)find、match、gsub、gmatch,需要的朋友可以參考下

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

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

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

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

簡單實用的find

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

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

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

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

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

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

find的兄弟match

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

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

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

替換利器gsub

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

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

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

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

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

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

這里還有重點需要介紹,也就是gsub的強大之處。先看一段代碼,然后再做介紹。
復(fù)制代碼 代碼如下:

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

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

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

沒法形容的gmatch

我也不知道要怎么形容gmatch,gmatch會返回一個迭代器函數(shù),你可以使用這個迭代器函數(shù)去迭代匹配的所有內(nèi)容??聪铝写a:

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

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

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

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

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

總結(jié)

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

相關(guān)文章

  • Lua協(xié)同程序函數(shù)coroutine使用實例

    Lua協(xié)同程序函數(shù)coroutine使用實例

    這篇文章主要介紹了Lua協(xié)同程序函數(shù)coroutine使用實例,協(xié)程是協(xié)同程序的簡稱,顧名思義,就是協(xié)同工作的程序,需要的朋友可以參考下
    2014-09-09
  • Lua中獲取utf8字符串長度的方法和自定義函數(shù)

    Lua中獲取utf8字符串長度的方法和自定義函數(shù)

    這篇文章主要介紹了Lua中獲取utf8字符串長度的方法和自定義函數(shù),本文給出了代碼實例并講解了UTF8的編碼規(guī)則,需要的朋友可以參考下
    2015-04-04
  • 舉例說明Lua中元表和元方法的使用

    舉例說明Lua中元表和元方法的使用

    這篇文章主要介紹了舉例說明Lua中元表和元方法的使用,文中--兩個橫線開始單行的注釋,--[[加上兩個[和]表示多行的注釋--]],需要的朋友可以參考下
    2015-07-07
  • Lua中調(diào)用C++函數(shù)示例

    Lua中調(diào)用C++函數(shù)示例

    這篇文章主要介紹了Lua中調(diào)用C++函數(shù)示例,本文給出的C++函數(shù)average()演示了如何接受多個參數(shù)且返回超過一個值,需要的朋友可以參考下
    2015-07-07
  • Lua中簡單的錯誤處理實例

    Lua中簡單的錯誤處理實例

    這篇文章主要介紹了Lua中簡單的錯誤處理實例,本文講解了Lua錯誤處理中的error、assert、pcall等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • Lua中的源代碼預(yù)編譯淺析

    Lua中的源代碼預(yù)編譯淺析

    這篇文章主要介紹了Lua中的源代碼預(yù)編譯淺析,Lua確實允許在運行源代碼之前,將源代碼預(yù)編譯成一種中間形式(類比Python的.pyc),需要的朋友可以參考下
    2014-09-09
  • Linux下編寫Lua擴展so文件和調(diào)用方法實例

    Linux下編寫Lua擴展so文件和調(diào)用方法實例

    這篇文章主要介紹了Linux下編寫Lua擴展so文件和調(diào)用方法實例,本文給出C語言代碼、編譯SO文件、Lua中調(diào)用代碼實例,需要的朋友可以參考下
    2015-05-05
  • Lua中函數(shù)的幾個特別之處探究

    Lua中函數(shù)的幾個特別之處探究

    這篇文章主要介紹了Lua中函數(shù)的幾個特別之處探究,本文講解了Lua的函數(shù)創(chuàng)建、函數(shù)的參數(shù)、函數(shù)參數(shù)個數(shù)自適應(yīng)、函數(shù)多重返回值等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • Lua基本語法

    Lua基本語法

    Lua是相當簡單易學(xué),本篇文章來給大家稍微講一下Lua的語法,不會長篇累牘得把Lua的所有語法都講一遍,這里通過以下幾點來講Lua語言的基礎(chǔ)語法。
    2015-05-05
  • Lua模塊和模塊載入淺析

    Lua模塊和模塊載入淺析

    這篇文章主要介紹了Lua模塊和模塊載入淺析,Lua模塊其實就是以.lua結(jié)尾的文件,模塊載入可以用requeire或者dofile,需要的朋友可以參考下
    2014-09-09

最新評論

新巴尔虎右旗| 赫章县| 威远县| 什邡市| 古交市| 兴化市| 宿迁市| 波密县| 随州市| 桦川县| 报价| 行唐县| 萨迦县| 西林县| 化州市| 沁阳市| 岳阳市| 鄢陵县| 应城市| 昆山市| 淮南市| 福州市| 敖汉旗| 玛沁县| 会昌县| 巨野县| 宁陵县| 巍山| 宣汉县| 太原市| 宿松县| 阳高县| 花莲县| 古交市| 凭祥市| 湘乡市| 吉安市| 岫岩| 西和县| 嘉兴市| 黑山县|