Lua 字串

字串或串(String)是由數字、字母、下劃線組成的一串字元。

Lua 語言中字串可以使用以下三種方式來表示:

  • 單引號間的一串字元。
  • 雙引號間的一串字元。
  • [[和]]間的一串字元。

以上三種方式的字串實例如下:

實例

string1 = "Lua"
print("\"字串 1 是\"",string1)
string2 = 'xuhuhu.com'
print("字串 2 是",string2)

string3 = [["Lua 教學"]]
print("字串 3 是",string3)

以上代碼執行輸出結果為:

"字串 1 是"    Lua
字串 2 是    xuhuhu.com
字串 3 是    "Lua 教學"

轉義字元用於表示不能直接顯示的字元,比如後退鍵,回車鍵,等。如在字串轉換雙引號可以使用 "\""。

所有的轉義字元和所對應的意義:

轉義字元
意義
ASCII碼值(十進位)
\a
響鈴(BEL)
007
\b
退格(BS) ,將當前位置移到前一列
008
\f
換頁(FF),將當前位置移到下頁開頭
012
\n
換行(LF) ,將當前位置移到下一行開頭
010
\r
回車(CR) ,將當前位置移到本行開頭
013
\t
水準製錶(HT) (跳到下一個TAB位置)
009
\v
垂直製錶(VT)
011
\\
代表一個反斜線字元''\'
092
\'
代表一個單引號(撇號)字元
039
\"
代表一個雙引號字元
034
\0
空字元(NULL)
000
\ddd
1到3位八進制數所代表的任意字元
三位八進制
\xhh
1到2位十六進制所代表的任意字元
二位十六進制

字串操作

Lua 提供了很多的方法來支持字串的操作:

序號方法 & 用途
1string.upper(argument):
字串全部轉為大寫字母。
2string.lower(argument):
字串全部轉為小寫字母。
3string.gsub(mainString,findString,replaceString,num)

在字串中替換。

mainString 為要操作的字串, findString 為被替換的字元,replaceString 要替換的字元,num 替換次數(可以忽略,則全部替換),如:
> string.gsub("aaaa","a","z",3);
zzza    3
4string.find (str, substr, [init, [end]])
在一個指定的目標字串中搜索指定的內容(第三個參數為索引),返回其具體位置。不存在則返回 nil。
> string.find("Hello Lua user", "Lua", 1)
7    9
5string.reverse(arg)
字串反轉
> string.reverse("Lua")
auL
6string.format(...)
返回一個類似printf的格式化字串
> string.format("the value is:%d",4)
the value is:4
7string.char(arg) 和 string.byte(arg[,int])
char 將整型數字轉成字元並連接, byte 轉換字元為整數值(可以指定某個字元,默認第一個字元)。
> string.char(97,98,99,100)
abcd
> string.byte("ABCD",4)
68
> string.byte("ABCD")
65
>
8string.len(arg)
計算字串長度。
string.len("abc")
3
9string.rep(string, n)
返回字串string的n個拷貝
> string.rep("abcd",2)
abcdabcd
10..
鏈接兩個字串
> print("www.zaixian.".."com")
www.xuhuhu.com
11string.gmatch(str, pattern)
回一個迭代器函數,每一次調用這個函數,返回一個在字串 str 找到的下一個符合 pattern 描述的子串。如果參數 pattern 描述的字串沒有找到,迭代函數返回nil。
> for word in string.gmatch("Hello Lua user", "%a+") do print(word) end
Hello
Lua
user
12string.match(str, pattern, init)
string.match()只尋找源字串str中的第一個配對. 參數init可選, 指定搜尋過程的起點, 默認為1。
在成功配對時, 函數將返回配對運算式中的所有捕獲結果; 如果沒有設置捕獲標記, 則返回整個配對字串. 當沒有成功的配對時, 返回nil。
> = 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"

字串大小寫轉換

以下實例演示了如何對字串大小寫進行轉換:

實例

string1 = "Lua";
print(string.upper(string1))
print(string.lower(string1))

以上代碼執行結果為:

LUA
lua

字串查找與反轉

以下實例演示了如何對字串進行查找與反轉操作:

實例

string = "Lua Tutorial"
-- 查找字串
print(string.find(string,"Tutorial"))
reversedString = string.reverse(string)
print("新字串為",reversedString)

以上代碼執行結果為:

5    12
新字串為    lairotuT auL

字串格式化

Lua 提供了 string.format() 函數來生成具有特定格式的字串, 函數的第一個參數是格式 , 之後是對應格式中每個代號的各種數據。

由於格式字串的存在, 使得產生的長字串可讀性大大提高了。這個函數的格式很像 C 語言中的 printf()。

以下實例演示了如何對字串進行格式化操作:

格式字串可能包含以下的轉義碼:

  • %c - 接受一個數字, 並將其轉化為ASCII碼表中對應的字元
  • %d, %i - 接受一個數字並將其轉化為有符號的整數格式
  • %o - 接受一個數字並將其轉化為八進制數格式
  • %u - 接受一個數字並將其轉化為無符號整數格式
  • %x - 接受一個數字並將其轉化為十六進制數格式, 使用小寫字母
  • %X - 接受一個數字並將其轉化為十六進制數格式, 使用大寫字母
  • %e - 接受一個數字並將其轉化為科學記數法格式, 使用小寫字母e
  • %E - 接受一個數字並將其轉化為科學記數法格式, 使用大寫字母E
  • %f - 接受一個數字並將其轉化為浮點數格式
  • %g(%G) - 接受一個數字並將其轉化為%e(%E, 對應%G)及%f中較短的一種格式
  • %q - 接受一個字串並將其轉化為可安全被Lua編譯器讀入的格式
  • %s - 接受一個字串並按照給定的參數格式化該字串

為進一步細化格式, 可以在%號後添加參數. 參數將以如下的順序讀入:

  • (1) 符號: 一個+號表示其後的數字轉義符將讓正數顯示正號. 默認情況下只有負數顯示符號.
  • (2) 占位符: 一個0, 在後面指定了字串寬度時占位用. 不填時的默認占位符是空格.
  • (3) 對齊標識: 在指定了字串寬度時, 默認為右對齊, 增加-號可以改為左對齊.
  • (4) 寬度數值
  • (5) 小數位數/字串裁切: 在寬度數值後增加的小數部分n, 若後接f(浮點數轉義符, 如%6.3f)則設定該浮點數的小數只保留n位, 若後接s(字串轉義符, 如%5.3s)則設定該字串只顯示前n位.

實例

string1 = "Lua"
string2 = "Tutorial"
number1 = 10
number2 = 20
-- 基本字串格式化
print(string.format("基本格式化 %s %s",string1,string2))
-- 日期格式化
date = 2; month = 1; year = 2014
print(string.format("日期格式化 %02d/%02d/%03d", date, month, year))
-- 十進位格式化
print(string.format("%.4f",1/3))

以上代碼執行結果為:

基本格式化 Lua Tutorial
日期格式化 02/01/2014
0.3333

其他例子:

實例

string.format("%c", 83)                 -- 輸出S
string.format("%+d", 17.0)              -- 輸出+17
string.format("%05d", 17)               -- 輸出00017
string.format("%o", 17)                 -- 輸出21
string.format("%u", 3.14)               -- 輸出3
string.format("%x", 13)                 -- 輸出d
string.format("%X", 13)                 -- 輸出D
string.format("%e", 1000)               -- 輸出1.000000e+03
string.format("%E", 1000)               -- 輸出1.000000E+03
string.format("%6.3f", 13)              -- 輸出13.000
string.format("%q", "One\nTwo")         -- 輸出"One\
                                        --   Two"
string.format("%s", "monkey")           -- 輸出monkey
string.format("%10s", "monkey")         -- 輸出    monkey
string.format("%5.3s", "monkey")        -- 輸出  mon

字元與整數相互轉換

以下實例演示了字元與整數相互轉換:

實例

-- 字元轉換
-- 轉換第一個字元
print(string.byte("Lua"))
-- 轉換第三個字元
print(string.byte("Lua",3))
-- 轉換末尾第一個字元
print(string.byte("Lua",-1))
-- 第二個字元
print(string.byte("Lua",2))
-- 轉換末尾第二個字元
print(string.byte("Lua",-2))

-- 整數 ASCII 碼轉換為字元
print(string.char(97))

以上代碼執行結果為:

76
97
97
117
117
a

其他常用函數

以下實例演示了其他字串操作,如計算字串長度,字串連接,字串複製等:

實例

string1 = "www."
string2 = "zaixian"
string3 = ".com"
-- 使用 .. 進行字串連接
print("連接字串",string1..string2..string3)

-- 字串長度
print("字串長度 ",string.len(string2))

-- 字串複製 2 次
repeatedString = string.rep(string2,2)
print(repeatedString)

以上代碼執行結果為:

連接字串    www.xuhuhu.com
字串長度     6
zaixianzaixian

匹配模式

Lua 中的匹配模式直接用常規的字串來描述。 它用於模式匹配函數 string.find, string.gmatch, string.gsub, string.match

你還可以在模式串中使用字元類。

字元類指可以匹配一個特定字元集合內任何字元的模式項。比如,字元類 %d 匹配任意數字。所以你可以使用模式串 %d%d/%d%d/%d%d%d%d 搜索 dd/mm/yyyy 格式的日期:

實例

s = "Deadline is 30/05/1999, firm"
date = "%d%d/%d%d/%d%d%d%d"
print(string.sub(s, string.find(s, date)))    --> 30/05/1999

下麵的表列出了Lua支持的所有字元類:

單個字元(除 ^$()%.[]*+-? 外): 與該字元自身配對
  • .(點): 與任何字元配對
  • %a: 與任何字母配對
  • %c: 與任何控制符配對(例如\n)
  • %d: 與任何數字配對
  • %l: 與任何小寫字母配對
  • %p: 與任何標點(punctuation)配對
  • %s: 與空白字元配對
  • %u: 與任何大寫字母配對
  • %w: 與任何字母/數字配對
  • %x: 與任何十六進制數配對
  • %z: 與任何代表0的字元配對
  • %x(此處x是非字母非數字字元): 與字元x配對. 主要用來處理運算式中有功能的字元(^$()%.[]*+-?)的配對問題, 例如%%與%配對
  • [數個字元類]: 與任何[]中包含的字元類配對. 例如[%w_]與任何字母/數字, 或下劃線符號(_)配對
  • [^數個字元類]: 與任何不包含在[]中的字元類配對. 例如[^%s]與任何非空白字元配對

當上述的字元類用大寫書寫時, 表示與非此字元類的任何字元配對. 例如, %S表示與任何非空白字元配對.例如,'%A'非字母的字元:

> print(string.gsub("hello, up-down!", "%A", "."))
hello..up.down.    4

數字4不是字串結果的一部分,他是gsub返回的第二個結果,代表發生替換的次數。

在模式匹配中有一些特殊字元,他們有特殊的意義,Lua中的特殊字元如下:

( ) . % + - * ? [ ^ $

'%' 用作特殊字元的轉義字元,因此 '%.' 匹配點;'%%' 匹配字元 '%'。轉義字元 '%'不僅可以用來轉義特殊字元,還可以用於所有的非字母的字元。

模式條目可以是:

  • 單個字元類匹配該類別中任意單個字元;
  • 單個字元類跟一個 '*', 將匹配零或多個該類的字元。 這個條目總是匹配盡可能長的串;
  • 單個字元類跟一個 '+', 將匹配一或更多個該類的字元。 這個條目總是匹配盡可能長的串;
  • 單個字元類跟一個 '-', 將匹配零或更多個該類的字元。 和 '*' 不同, 這個條目總是匹配盡可能短的串;
  • 單個字元類跟一個 '?', 將匹配零或一個該類的字元。 只要有可能,它會匹配一個;
  • %n, 這裏的 n 可以從 1 到 9; 這個條目匹配一個等於 n 號捕獲物(後面有描述)的子串。
  • %bxy, 這裏的 xy 是兩個明確的字元; 這個條目匹配以 x 開始 y 結束, 且其中 xy 保持 平衡 的字串。 意思是,如果從左到右讀這個字串,對每次讀到一個 x+1 ,讀到一個 y-1, 最終結束處的那個 y 是第一個記數到 0 的 y。 舉個例子,條目 %b() 可以匹配到括弧平衡的運算式。
  • %f[set], 指 邊境模式; 這個條目會匹配到一個位於 set 內某個字元之前的一個空串, 且這個位置的前一個字元不屬於 set 。 集合 set 的含義如前面所述。 匹配出的那個空串之開始和結束點的計算就看成該處有個字元 '\0' 一樣。

模式:

模式 指一個模式條目的序列。 在模式最前面加上符號 '^' 將錨定從字串的開始處做匹配。 在模式最後面加上符號 '$' 將使匹配過程錨定到字串的結尾。 如果 '^' 和 '$' 出現在其他位置,它們均沒有特殊含義,只表示自身。

捕獲:

模式可以在內部用小括弧括起一個子模式; 這些子模式被稱為 捕獲物。 當匹配成功時,由 捕獲物 匹配到的字串中的子串被保存起來用於未來的用途。 捕獲物以它們左括弧的次序來編號。 例如,對於模式 "(a*(.)%w(%s*))" , 字串中匹配到 "a*(.)%w(%s*)" 的部分保存在第一個捕獲物中 (因此是編號 1 ); 由 "." 匹配到的字元是 2 號捕獲物, 匹配到 "%s*" 的那部分是 3 號。

作為一個特例,空的捕獲 () 將捕獲到當前字串的位置(它是一個數字)。 例如,如果將模式 "()aa()" 作用到字串 "flaaap" 上,將產生兩個捕獲物: 3 和 5 。