Lua 字符串

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

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

  • 單引號間的一串字符。

  • 雙引號間的一串字符。

  • [[]] 間的一串字符。

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

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

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

以上代碼執(zhí)行輸出結(jié)果為:

"字符串 1 是"    Lua
字符串 2 是    (cainiaoplus.com)
字符串 3 是    "Lua 教程"

轉(zhuǎn)義字符用于表示不能直接顯示的字符,比如后退鍵,回車鍵,等。如在字符串轉(zhuǎn)換雙引號可以使用 "\""。

所有的轉(zhuǎn)義字符和所對應(yīng)的意義:

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

字符串操作

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

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

在字符串中替換。

mainString 為要操作的字符串, findString 為被替換的字符,replaceString 要替換的字符,num 替換次數(shù)(可以忽略,則全部替換),如:
> string.gsub("aaaa","a","z",3);
zzza    3
4string.find (str, substr, [init, [end]])
在一個指定的目標(biāo)字符串中搜索指定的內(nèi)容(第三個參數(shù)為索引),返回其具體位置。不存在則返回 nil。
> string.find("Hello Lua user", "Lua", 1) 
7    9
5string.reverse(arg)
字符串反轉(zhuǎn)
> 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 將整型數(shù)字轉(zhuǎn)成字符并連接, byte 轉(zhuǎn)換字符為整數(shù)值(可以指定某個字符,默認(rèn)第一個字符)。
> 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.nhooo.".."com")
www.soo66.com
11string.gmatch(str, pattern)
回一個迭代器函數(shù),每一次調(diào)用這個函數(shù),返回一個在字符串 str 找到的下一個符合 pattern 描述的子串。如果參數(shù) pattern 描述的字符串沒有找到,迭代函數(shù)返回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中的第一個配對. 參數(shù)init可選, 指定搜尋過程的起點(diǎn), 默認(rèn)為1。
在成功配對時, 函數(shù)將返回配對表達(dá)式中的所有捕獲結(jié)果; 如果沒有設(shè)置捕獲標(biāo)記, 則返回整個配對字符串. 當(dāng)沒有成功的配對時, 返回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"

字符串截取

字符串截取使用 sub() 方法。

string.sub() 用于截取字符串,原型為:

string.sub(s, i [, j])

參數(shù)說明:

  • s:要截取的字符串。

  • i:截取開始位置。

  • j:截取結(jié)束位置,默認(rèn)為 -1,最后一個字符。

-- 字符串
local sourcestr = "prefix--nhooogoogletaobao--suffix"
print("\n原始字符串", string.format("%q", sourcestr))

-- 截取部分,第1個到第15個
local first_sub = string.sub(sourcestr, 4, 15)
print("\n第一次截取", string.format("%q", first_sub))

-- 取字符串前綴,第1個到第8個
local second_sub = string.sub(sourcestr, 1, 8)
print("\n第二次截取", string.format("%q", second_sub))

-- 截取最后10個
local third_sub = string.sub(sourcestr, -10)
print("\n第三次截取", string.format("%q", third_sub))

-- 索引越界,輸出原始字符串
local fourth_sub = string.sub(sourcestr, -100)
print("\n第四次截取", string.format("%q", fourth_sub))

以上代碼執(zhí)行結(jié)果為:

原始字符串    "prefix--nhooogoogletaobao--suffix"
第一次截取    "fix--nhooog"
第二次截取    "prefix--"
第三次截取    "ao--suffix"
第四次截取    "prefix--nhooogoogletaobao--suffix"

字符串大小寫轉(zhuǎn)換

以下示例演示了如何對字符串大小寫進(jìn)行轉(zhuǎn)換:

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

以上代碼執(zhí)行結(jié)果為:

LUA
lua

字符串查找與反轉(zhuǎn)

以下示例演示了如何對字符串進(jìn)行查找與反轉(zhuǎn)操作:

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

以上代碼執(zhí)行結(jié)果為:

5    12
新字符串為    lairotuT auL

字符串格式化

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

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

以下示例演示了如何對字符串進(jìn)行格式化操作:

格式字符串可能包含以下的轉(zhuǎn)義碼:

  • %c - 接受一個數(shù)字, 并將其轉(zhuǎn)化為ASCII碼表中對應(yīng)的字符

  • %d, %i - 接受一個數(shù)字并將其轉(zhuǎn)化為有符號的整數(shù)格式

  • %o - 接受一個數(shù)字并將其轉(zhuǎn)化為八進(jìn)制數(shù)格式

  • %u - 接受一個數(shù)字并將其轉(zhuǎn)化為無符號整數(shù)格式

  • %x - 接受一個數(shù)字并將其轉(zhuǎn)化為十六進(jìn)制數(shù)格式, 使用小寫字母

  • %X - 接受一個數(shù)字并將其轉(zhuǎn)化為十六進(jìn)制數(shù)格式, 使用大寫字母

  • %e - 接受一個數(shù)字并將其轉(zhuǎn)化為科學(xué)記數(shù)法格式, 使用小寫字母e

  • %E - 接受一個數(shù)字并將其轉(zhuǎn)化為科學(xué)記數(shù)法格式, 使用大寫字母E

  • %f - 接受一個數(shù)字并將其轉(zhuǎn)化為浮點(diǎn)數(shù)格式

  • %g(%G) - 接受一個數(shù)字并將其轉(zhuǎn)化為%e(%E, 對應(yīng)%G)及%f中較短的一種格式

  • %q - 接受一個字符串并將其轉(zhuǎn)化為可安全被Lua編譯器讀入的格式

  • %s - 接受一個字符串并按照給定的參數(shù)格式化該字符串

為進(jìn)一步細(xì)化格式, 可以在%號后添加參數(shù). 參數(shù)將以如下的順序讀入:

  • (1) 符號: 一個+號表示其后的數(shù)字轉(zhuǎn)義符將讓正數(shù)顯示正號. 默認(rèn)情況下只有負(fù)數(shù)顯示符號.

  • (2) 占位符: 一個0, 在后面指定了字串寬度時占位用. 不填時的默認(rèn)占位符是空格.

  • (3) 對齊標(biāo)識: 在指定了字串寬度時, 默認(rèn)為右對齊, 增加-號可以改為左對齊.

  • (4) 寬度數(shù)值

  • (5) 小數(shù)位數(shù)/字串裁切: 在寬度數(shù)值后增加的小數(shù)部分n, 若后接f(浮點(diǎn)數(shù)轉(zhuǎn)義符, 如%6.3f)則設(shè)定該浮點(diǎn)數(shù)的小數(shù)只保留n位, 若后接s(字符串轉(zhuǎn)義符, 如%5.3s)則設(shè)定該字符串只顯示前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))
-- 十進(jìn)制格式化
print(string.format("%.4f",1/3))

以上代碼執(zhí)行結(jié)果為:

基本格式化 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

字符與整數(shù)相互轉(zhuǎn)換

以下示例演示了字符與整數(shù)相互轉(zhuǎn)換:

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

-- 整數(shù) ASCII 碼轉(zhuǎn)換為字符
print(string.char(97))

以上代碼執(zhí)行結(jié)果為:

76
97
97
117
117
a

其他常用函數(shù)

以下示例演示了其他字符串操作,如計算字符串長度,字符串連接,字符串復(fù)制等:

string1 = "www."
string2 = "nhooo"
string3 = ".com"
-- 使用 .. 進(jìn)行字符串連接
print("連接字符串",string1..string2..string3)

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

-- 字符串復(fù)制 2 次
repeatedString = string.rep(string2,2)
print(repeatedString)

以上代碼執(zhí)行結(jié)果為:

連接字符串    www.soo66.com
字符串長度     5
nhooonhooo

匹配模式

Lua 中的匹配模式直接用常規(guī)的字符串來描述。 它用于模式匹配函數(shù) string.find, string.gmatch, string.gsub, string.match。

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

字符類指可以匹配一個特定字符集合內(nèi)任何字符的模式項。比如,字符類 %d 匹配任意數(shù)字。所以你可以使用模式串  %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支持的所有字符類:

單個字符(除 ^$()%.[]*+-? 外): 與該字符自身配對

  • .(點(diǎn)): 與任何字符配對

  • %a: 與任何字母配對

  • %c: 與任何控制符配對(例如\n)

  • %d: 與任何數(shù)字配對

  • %l: 與任何小寫字母配對

  • %p: 與任何標(biāo)點(diǎn)(punctuation)配對

  • %s: 與空白字符配對

  • %u: 與任何大寫字母配對

  • %w: 與任何字母/數(shù)字配對

  • %x: 與任何十六進(jìn)制數(shù)配對

  • %z: 與任何代表0的字符配對

  • %x(此處x是非字母非數(shù)字字符): 與字符x配對. 主要用來處理表達(dá)式中有功能的字符(^$()%.[]*+-?)的配對問題, 例如%%與%配對

  • [數(shù)個字符類]: 與任何[]中包含的字符類配對. 例如[%w_]與任何字母/數(shù)字, 或下劃線符號(_)配對

  • [^數(shù)個字符類]: 與任何不包含在[]中的字符類配對. 例如[^%s]與任何非空白字符配對

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

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

數(shù)字4不是字符串結(jié)果的一部分,他是gsub返回的第二個結(jié)果,代表發(fā)生替換的次數(shù)。

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

( ) . % + - * ? [ ^ $

'%' 用作特殊字符的轉(zhuǎn)義字符,因此 '%.' 匹配點(diǎn);'%%' 匹配字符 '%'。轉(zhuǎn)義字符 '%'不僅可以用來轉(zhuǎn)義特殊字符,還可以用于所有的非字母的字符。

模式條目可以是:

  • 單個字符類匹配該類別中任意單個字符;

  • 單個字符類跟一個 '*', 將匹配零或多個該類的字符。 這個條目總是匹配盡可能長的串;

  • 單個字符類跟一個 '+', 將匹配一或更多個該類的字符。 這個條目總是匹配盡可能長的串;

  • 單個字符類跟一個 '-', 將匹配零或更多個該類的字符。 和 '*' 不同, 這個條目總是匹配盡可能短的串;

  • 單個字符類跟一個 '?', 將匹配零或一個該類的字符。 只要有可能,它會匹配一個;

  • %n, 這里的 n 可以從 1 到 9; 這個條目匹配一個等于 n 號捕獲物(后面有描述)的子串。

  • %bxy, 這里的 xy 是兩個明確的字符; 這個條目匹配以 x 開始 y 結(jié)束, 且其中 xy 保持 平衡 的字符串。 意思是,如果從左到右讀這個字符串,對每次讀到一個x+1 ,讀到一個 y-1, 最終結(jié)束處的那個 y 是第一個記數(shù)到 0 的 y。 舉個實例,條目 %b() 可以匹配到括號平衡的表達(dá)式。

  • %f[set], 指 邊境模式; 這個條目會匹配到一個位于 set 內(nèi)某個字符之前的一個空串, 且這個位置的前一個字符不屬于 set 。 集合 set 的含義如前面所述。 匹配出的那個空串之開始和結(jié)束點(diǎn)的計算就看成該處有個字符 '\0' 一樣。

模式:

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

捕獲:

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

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

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清