Lua字符串可以使用以下三種方式表示:
-
單引號間的一串字符。
-
雙引號間的一串字符。
-
[[和]]間的一串字符。
string = [["Lua"]] print("字符串 是",string) --字符串 是 "Lua"
Lua 提供很多內建方法支持字符串的操作:
-
string.upper(argument):
-->字符串全部轉為大寫字母
-
string.lower(argument):
-->字符串全部轉為大寫字母
-
string.gsub(mainString,findString,replaceString,num)
-->在字符串中替換,mainString為要替換的字符串, findString 為被替換的字符,replaceString 要替換的字符,num 替換次數(可以忽略,則全部替換),返回的值是value+替換的length,如:
string.gsub("aaaa","a","b",3);
--bbba 3
PS: gsub有一個重要的功能就是透過模式匹配過濾或者返回你想去除的字串,模式介紹參考下面拓展部分
--實例1 對字符串中的每一個字母進行復制,並用連字符將復制的字母和原字母連接
p,_= string.gsub("hello Lua!", "(%a)", "%1-%1")
print(p)
--h-he-el-ll-lo-o L-Lu-ua-a!
--實例2 互換相鄰的字符
p,_=string.gsub("hello Lua", "(.)(.)", "%2%1")
print(p)
--ehll ouLa
--替換掉字符里的字母a和尖括號
local text = string.gsub(text, '[a<>]', '')
--替換掉特殊的符號
local text = string.gsub(text, "%[", "")
local text = string.gsub(text, "%]", "")
--也可以這樣
local text = string.gsub(text, "[%[%]]", "")
- string.find (s, pattern [, init [, plain]])**
-->在一個指定的目標字符串中搜索指定的內容(第三個參數為索引),返回其具體位置,不存在則返回 nil,其中init 代表起始位置。
print(string.find("test", 'es'))
----輸出 2 3
如果我們只想要 string.find 返回的第二個值, 可以使用 虛變量(即 下划線)
_, q=string.find("test", 'es')
print(q) ---- 輸出 3
如果我們只想要 string.find 返回的第1個值,下划線代表當前return 變量, 對find進行賦值再打印即可
q,_ = string.find("test", 'es')
print(q) ----輸出2
拓展-->字符串模式匹配
pair = "name = Anna"
_, _, key, value = string.find(pair, "(%a+)%s*=%s*(%a+)")
print(key, value)
-- 輸出 name Anna
如果 find 的第二個參數使用了某種匹配模式, 並且模式串里面帶括號。 那么表示會“捕捉”括號括起來的模式匹配到的字符串。 捕捉, 當然會把他們作為返回值。這里捕捉了兩下, 所以 find 返回了兩個值
Lua支持的字符類有:
. 任意字符
%s 空白符
%p 標點
%c 控制字符
%d 數字
%x 十六進制數
%z 代表0的字符
%a 字母
%l 小寫字母
%u 大寫字母
%w 字母數字
字符類的大寫形式代表相應集合的補集, 比如:%A 表示除了字母以外的字符集
另外還有模式修飾符,* + - 三個,作為通配符分別表示:
*: 匹配前面指定的 0 或多個同類字符, 盡可能匹配更長的符合條件的字串
--先盡可能長的把本次匹配模式走完,再繼續一下一個模式
+: 匹配前面指定的 1 或多個同類字符, 盡可能匹配更長的符合條件的字串
--匹配前一字符1次或者多次
-: 匹配前面指定的 0 或多個同類字符, 盡可能匹配更短的符合條件的字串
--本次匹配模式每走一步,就確認一下一個模式能否進入
? 匹配前一字符0次或1次
^ 匹配字符串開頭
$ 匹配字符串結尾
模式串中的特殊字符
( ) . % + - * ? [ ^ $
'%' 用作特殊字符的轉義字符
'%.' 匹配點;
'%%' 匹配字符 '%'。
轉義字符 '%'不僅可以用來轉義特殊字符,還可以用於所有的非字母的字符。當對一個字符有疑問的時候,為安全起見請使用轉義字符轉義他。
用'[]'創建字符集
'[%w_]' 匹配字母數字和下划線
'[01]' 匹配二進制數字
'[%[%]]'匹配一對方括號
在'[]'中使用連字符'-'
'%d' 表示 '[0-9]';
'%x' 表示 '[0-9a-fA-F]'
'[0-7]' 表示 '[01234567]'
在'[]'開始處使用 '^' 表示其補集:
'[0-7]' 匹配任何不是八進制數字的字符;
'[^\n]' 匹配任何非換行符戶的字符。
'[^%s]' == '%S'
於是, "(%a+)%s=%s(%a+)" 表示, 先匹配一個或多個字母, 然后是零個或多個空白符(比如空格), 然后是個 '=', 然后空白符, 然后字母。這樣, 滿足匹配的只有 "name = Anna"。 所以輸出位置為 2 12.
因為捕獲了兩個 (%a+), 也就是 name, Anna 這兩個單詞, 所以還輸出了這兩個單詞
另外, lua 使用 %1-%9 表示拷貝捕獲。
捕獲是這樣一種機制:可以使用模式串的一部分匹配目標串的一部分。將你想捕獲的模式用圓括號括起來,就指定了一個捕獲
s="abc \"it's a cat\""
_,_,_,q=string.find(s, "([\"'])(.-)%1")
print(q) -----輸出: it's a cat
首先, ["'] 表示匹配 雙引號或者單引號, 因為有括號,所以引號被捕獲。 然后匹配幾個任意字符並且捕獲他, 最后 %1 匹配與第一次捕獲到的(即引號)相同的字串。所以整個模式匹配到的是 "it's a cat", 而第二次捕獲的是去掉兩頭引號的字串, 即 it's a cat.
'-' 與 '*' 到底有什么不同呢? 在上面, "(["'])(.*)%1" 匹配到的結果與 '-' 是一樣的。盡可能匹配更長, 盡可能匹配更短 究竟什么不同呢?看例子:
print( ("\"hello\" \"hello\""):find('"(.+)"') ) ----輸出 1 15 hello" "hello
print( ("\"hello\" \"hello\""):find('"(.-)"') ) ----輸出 1 7 hello
- * 盡可能長, 所以匹配了首尾兩個 引號, 捕獲了中間的 (hello" "hello)
-
- 盡可能短, 所以碰到第二個引號就說匹配完了, 因此只捕獲了第一個 (hello)
我們可以用string.find 搭配匹配字符獲得我們想要的字串
date = "17/7/1990"
_, _, d, m, y = string.find(date, "(%d+)/(%d+)/(%d+)")
print(d, m, y) --> 17 7 1990
-
string.reverse(arg)
—>字符串反轉
string.reverse("Lua") --auL
-
string.format(...)
返回一個類似printf的格式化字符串
string.format("the value is:%d",4)
--the value is:4
-
string.char(arg) 和 string.byte(arg[,int])
char 將整型數字轉成字符並連接, byte 轉換字符為整數值(可以指定某個字符,默認第一個字符)。
> string.char(97,98,99,100)
abcd
> string.byte("ABCD",4)
68
> string.byte("ABCD")
65
-
string.len(arg)
計算字符串長度
string.len("abc")
--3
-
string.rep(string, n)
回字符串string的n個拷貝
string.rep("abcd",2)
abcdabcd
- string.gmatch(str, pattern)
return一個迭代器函數,每一次調用這個函數,會返回一個在字符串 str 找到的下一個符合 pattern 描述的子串。如果參數 pattern 描述的字符串沒有找到,迭代函數返回nil。
for word in string.gmatch("Hello Lua user", "%a+")
do
print(word)
end
Hello
Lua
user
- string.match(str, pattern, init)
string.match()只尋找源字串str中的第一個配對. 參數init可選, 指定搜尋過程的起點, 默認為1。
在成功配對時, 函數將返回配對表達式中的所有捕獲結果; 如果沒有設置捕獲標記, 則返回整個配對字符串. 當沒有成功的配對時, 返回nil。
local path = "c:/home/test/1.txt"
local name = string.match(path, ".+/(.+)")
print("name:", name)
--1.txt
string.match("I have 2 questions for you.", "%d+ %a+")
--2 questions
string.format("%d, %q", string.match("I have 2 questions for you.", "(%d+) (%a+)"))
--2, "questions"
- string.sub(str,i[,j])
用於字符串截取,返回截取長度的字符串(區間為閉)
a = "abc1test 123"
print (string.sub(a,2))
--bc1test 123
print (string.sub(a,2,4))
--bc1