top
Loading...
Lua 字符串

Lua 字符串

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

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

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

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

string1 = "Lua"
print("\"字符串 1 是\"",string1)
string2 = ''
print("字符串 2 是",string2)
string3 = [["Lua 教程"]]
print("字符串 3 是",string3)

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

"字符串 1 是"    Lua
字符串 2 是    
字符串 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.runoob".."com")
www.runoobcom
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 = "runoob"
string3 = ".com"
-- 使用 .. 進行字符串連接
print("連接字符串",string1..string2..string3)
-- 字符串長度
print("字符串長度 ",string.len(string2))
-- 字符串復製 2 次
repeatedString = string.rep(string2,2)
print(repeatedString)
連接字符串    www.sharebody.com
字符串長度     6
runoobrunoob

匹配模式

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 。