當前位置:成語大全網 - 英語詞典 - lua入門筆記7 字符串庫

lua入門筆記7 字符串庫

Lua 中的 string 和 c #中相同, string 類型的值壹旦改變,便要為新值開辟空間,並指向此空間。也就是說每次對 string 變量進行更改操作時返回的是壹個新的值,下面的函數中就不再過多去說明了。

其他還有很多這裏只是簡單地舉幾個例子。

Lua 中由於考慮大小,沒有支持正則表達式。而采用了自己的模式匹配。

string.find 函數用於在壹個給定的目標字符串中搜索壹個模式。最簡單的是搜索單詞。如果趙傲這個單詞,他就會返回單詞的其實索引和結束所用,如果沒找到則返回 nil

如果匹配成功,就可以用 string,find 的返回值結果來調用 string.sub 來提取出目標字符串中匹配於該模式的那部分子串。

string.find 還有壹個可選的第三參數,他是壹個索引,告訴函數應從目標字符串的那個位置開始搜索。

函數 string.math 和函數 string.find 在某種意義上很相似,它也是用壹個在字符串中搜索的壹種模式。不同的是, string.math 返回的是目標字符串中模式匹配的那部分子串,而並非位置。

對於固定的模式,該函數可能沒有什麽意義例如 "hello" 。但當使用變量模式是,它的特性就顯現出來了。

string.gusb 函數有3個參數:目標字符串、模式、替換字符串 作用就是將所有出現該模式的地方替換為替換字符串

另外還有可選的第四個參數,可以限制替換的次數

函數是 string.gsub 還有壹種結果,即實際替換的次數,例如下面就是壹種統計字符串中空格數量的簡單方法

string.gmatch 會返回壹個函數。通過這個函數可以遍歷到壹個字符串中所有出現指定摸式的地方。

其中模式 "%a+" 表示匹配壹個或多個字母字符的序列(也就是單詞),這裏會遍歷其中所有的單詞,並存入其中。在模式中"點"具有特殊的意義,因此若要表示壹個點必須寫為 "%."

介意用字符分類創建更多有用的模式。字符分類就是模式中的壹項。可以與壹個熱頂級和中的任意字符相匹配。例如分類"%d"可匹配任意數字。例如可以用

"%d%d/%d%d/%d%d%d%d" 來搜索符合 "dd/mm/yyyy" 格式的日期

下面是所有的字符分類

這些分類的大寫行使表示他們的補集,例如 "%A" 表示所有非字母字符

在模式裏,還有壹些字符串被稱為“魔法字符”他們有著特殊的含義。這些魔法字符有

{ } . % + - * ? [ ] ^ $

字符串 % 作為這些魔法字符的轉義符,例如 "%." 表示匹配壹個點 "%%" 表示匹配字符 "%" 不僅可以把 "%" 用於魔法字符,還可以用於其他所有非字母數字的字符。當不確定某個字符是不是需要被轉義是,應該直接前置壹個轉義符。

對於 lua 來說,模式就是普通的字符串。並想起他字符串壹樣遵循相同的規則。只有模式函數才會解釋它們,此時參會將 "%" 當做轉義符來處理。

在壹堆放括號內將不同的字符分類或者單個字符組合起來,即可創造出屬於用戶自己的字符分類,這種新的字符分類叫做 字符集(char-set) 。例如,字符集 ["%w_"] 表示同時匹配字母、數字和下劃線。字符集 [01] 表示匹配二進制數字 字符集 [%[%]] 表示匹配方括號本身。如果需要統計壹段文本中元音的數量,可以這麽寫

在字符集中表示壹段字符範圍的做法是寫出自付範圍的第壹個字符和最後壹個字符並用橫線連接它們,但這種形式用的較少因為大部分常用的字符範圍都已經預定義好了。如 [0-9] 即為 %d

[0-9a-fA-F] 則為 "%x" 不過如果需要查找壹個8進制的數字,那麽可以寫 [0-7] 而不是 [01234567] 。在壹個字符集前加壹個 '^' 即可表示這個字符集的補集。例如 [^0-7] 表示所有非八進制數字的字符。而模式 [^\n] 則表示了除了換行符之外的其他字符。對於簡單地分類,使用大寫形式也可以得到他的補集, "%S" 顯然比 [^%s] 簡答

也可以通過修飾符來藐視模式中的重復可選部分。lua提供四種修飾符

“+” 修飾符科普配屬於字符串分類的壹個或多個字符。他總是獲取與模式相匹配的最長序列,模式 "%a+" 表示壹個或多個字母,即單詞:

模式 "%d+" 匹配壹個或多個數組(壹個整數)

修飾符 "*" 類似於 "+" ,但它還接受出現0次的情況。壹種典型用途是匹配壹個模式不同部分之間的空格。 比如說像匹配 () 或者 ( ) 這樣的壹對圓括號,可以用 "%(%s*%)" 其中的 %s* 可以匹配0到多個空格

另壹個示例是使用模式 "[_%a][_%w]*" 來匹配lua中的標識符,標識符是壹個由字母或下劃線開始,伴隨0到多個下劃線、字母或數字的序列。

修飾符 "-" 和 "*" 壹樣,也是用於匹配0個或多個字符的。不過他會匹配最短的子串。雖然看似二者沒什麽差別但效果截然不同。如果使用 "[_%a][_%w]- " 來查找壹個標識符時,他只會查找到第壹個字母,因為 "[_%w]-" 總是匹配空串。假設要查找壹個c程序中的註釋,通常會首先嘗試 "/%*.*%/" 然後由於 ".* "會盡可能的擴展,因此程序中第壹個 "/*" 只會與最後壹個 "*/" 相匹配

但若使用 ".-"話就會變成這樣

修飾符"?"用於匹配壹個可選的字符。例如要在壹段文本中尋找壹個整數,而這個整數可以包括壹個可選的正負號。那麽適用模式"[+-]?%d+"就可以完成這項任任務。他可以匹配項

"-12" "23" "+1000"這樣的數字,而"[+-]"是壹個匹配'+'號和'-'號的字符分類,後面的'?'說明可這個符號是可選的。與其他系統不同的是,Lua中的修飾符只能用用於壹個字符分類,無法對壹組分類進行修飾。無法寫出壹個匹配可選打次的模式。

如果壹個模式以壹個'^'起始,那麽他只會匹配目標字符串的開頭部分。如果模式以'$'結尾,他只會匹配目標字符串的結尾部分。

在模式中,還可以用"%b",用於匹配成對的字符。他的寫法是"%b<x><y>" 其中<x>和<y>是兩個不同的字符串,<x>作為壹個起始字符,<y>是作為壹個結束字符。例如模式"%b()"可匹配以'('開始,並以')'結束的子串s

Lua 中的 string 和 c #中相同, string 類型的值壹旦改變,便要為新值開辟空間,並指向此空間。也就是說每次對 string 變量進行更改操作時返回的是壹個新的值,下面的函數中就不再過多去說明了。

其他還有很多這裏只是簡單地舉幾個例子。

Lua 中由於考慮大小,沒有支持正則表達式。而采用了自己的模式匹配。

string.find 函數用於在壹個給定的目標字符串中搜索壹個模式。最簡單的是搜索單詞。如果趙傲這個單詞,他就會返回單詞的其實索引和結束所用,如果沒找到則返回 nil

如果匹配成功,就可以用 string,find 的返回值結果來調用 string.sub 來提取出目標字符串中匹配於該模式的那部分子串。

string.find 還有壹個可選的第三參數,他是壹個索引,告訴函數應從目標字符串的那個位置開始搜索。

函數 string.math 和函數 string.find 在某種意義上很相似,它也是用壹個在字符串中搜索的壹種模式。不同的是, string.math 返回的是目標字符串中模式匹配的那部分子串,而並非位置。

對於固定的模式,該函數可能沒有什麽意義例如 "hello" 。但當使用變量模式是,它的特性就顯現出來了。

string.gusb 函數有3個參數:目標字符串、模式、替換字符串 作用就是將所有出現該模式的地方替換為替換字符串

另外還有可選的第四個參數,可以限制替換的次數

函數是 string.gsub 還有壹種結果,即實際替換的次數,例如下面就是壹種統計字符串中空格數量的簡單方法

string.gmatch 會返回壹個函數。通過這個函數可以遍歷到壹個字符串中所有出現指定摸式的地方。

其中模式 "%a+" 表示匹配壹個或多個字母字符的序列(也就是單詞),這裏會遍歷其中所有的單詞,並存入其中。在模式中"點"具有特殊的意義,因此若要表示壹個點必須寫為 "%."

介意用字符分類創建更多有用的模式。字符分類就是模式中的壹項。可以與壹個熱頂級和中的任意字符相匹配。例如分類 "%d" 可匹配任意數字。例如可以用

"%d%d/%d%d/%d%d%d%d" 來搜索符合"dd/mm/yyyy"格式的日期

下面是所有的字符分類

這些分類的大寫行使表示他們的補集,例如"%A"表示所有非字母字符

在模式裏,還有壹些字符串被稱為“魔法字符”他們有著特殊的含義。這些魔法字符有

{ } . % + - * ? [ ] ^ $

字符串 % 作為這些魔法字符的轉義符,例如 "%." 表示匹配壹個點 "%%" 表示匹配字符 "%" 不僅可以把 "%" 用於魔法字符,還可以用於其他所有非字母數字的字符。當不確定某個字符是不是需要被轉義是,應該直接前置壹個轉義符。

對於 lua 來說,模式就是普通的字符串。並想起他字符串壹樣遵循相同的規則。只有模式函數才會解釋它們,此時參會將 "%" 當做轉義符來處理。

在壹堆放括號內將不同的字符分類或者單個字符組合起來,即可創造出屬於用戶自己的字符分類,這種新的字符分類叫做 字符集 (char-set) 。例如,字符集 ["%w_"] 表示同時匹配字母、數字和下劃線。字符集 [01] 表示匹配二進制數字 字符集 [%[%]] 表示匹配方括號本身。如果需要統計壹段文本中元音的數量,可以這麽寫

在字符集中表示壹段字符範圍的做法是寫出自付範圍的第壹個字符和最後壹個字符並用橫線連接它們,但這種形式用的較少因為大部分常用的字符範圍都已經預定義好了。如 [0-9] 即為 %d

[0-9a-fA-F] 則為 "%x" 不過如果需要查找壹個8進制的數字,那麽可以寫 [0-7] 而不是 [01234567] 。在壹個字符集前加壹個 '^' 即可表示這個字符集的補集。例如 [^0-7] 表示所有非八進制數字的字符。而模式 [^\n] 則表示了除了換行符之外的其他字符。對於簡單地分類,使用大寫形式也可以得到他的補集, "%S" 顯然比 [^%s] 簡答

也可以通過修飾符來藐視模式中的重復可選部分。 lua 提供四種修飾符

“+” 修飾符科普配屬於字符串分類的壹個或多個字符。他總是獲取與模式相匹配的最長序列,模式 "%a+" 表示壹個或多個字母,即單詞:

模式 "%d+" 匹配壹個或多個數組(壹個整數)

修飾符 "*" 類似於 "+" ,但它還接受出現0次的情況。壹種典型用途是匹配壹個模式不同部分之間的空格。 比如說像匹配 () 或者 ( ) 這樣的壹對圓括號,可以用 "%(%s*%)" 其中的 %s* 可以匹配0到多個空格

另壹個示例是使用模式 "[_%a][_%w]*" 來匹配 lua 中的標識符,標識符是壹個由字母或下劃線開始,伴隨0到多個下劃線、字母或數字的序列。

修飾符 "-" 和 "*" 壹樣,也是用於匹配0個或多個字符的。不過他會匹配最短的子串。雖然看似二者沒什麽差別但效果截然不同。如果使用 "[_%a][_%w]- " 來查找壹個標識符時,他只會查找到第壹個字母,因為 "[_%w]-" 總是匹配空串。假設要查找壹個c程序中的註釋,通常會首先嘗試 "/%*.*%/" 然後由於 ".*" 會盡可能的擴展,因此程序中第壹個 "/*" 只會與最後壹個 "*/" 相匹配

但若使用 ".-" 話就會變成這樣

修飾符 "?" 用於匹配壹個可選的字符。例如要在壹段文本中尋找壹個整數,而這個整數可以包括壹個可選的正負號。那麽適用模式 "[+-]?%d+" 就可以完成這項任任務。他可以匹配項

"-12" "23" "+1000" 這樣的數字,而 "[+-]" 是壹個匹配 '+' 號和 '-' 號的字符分類,後面的 '?' 說明可這個符號是可選的。與其他系統不同的是, Lua 中的修飾符只能用用於壹個字符分類,無法對壹組分類進行修飾。無法寫出壹個匹配可選打次的模式。

如果壹個模式以壹個 '^' 起始,那麽他只會匹配目標字符串的開頭部分。如果模式以 '$' 結尾,他只會匹配目標字符串的結尾部分。

在模式中,還可以用 "%b" ,用於匹配成對的 字符 。他的寫法是 "%b<x><y>" 其中 <x> 和 <y> 是兩個不同的字符串, <x> 作為壹個起始字符, <y> 是作為壹個結束字符。例如模式 "%b()" 可匹配以 '('開始,並以')' 結束的子串

s="a (enclosed (in) parenthesses) line"

print(string.gsub(s,"%d()","") -->a line

這種模式的典型用法包括 "%b()" "%b[]" "%b{}" "%b<>"

捕獲功能可根據壹個模式從目標字符串中抽出匹配與該模式的內容。在指定捕獲時,應將模式中需要捕獲的部分寫到壹對圓括號內。

這裏括號中的值為匹配兩個單詞,括號外是首先匹配空格然後匹配等號繼續匹配空格。並且會把表達式中用 () 括起來的值返回。