基本函数

函数

描述

示例

结果

len

计算字符串长度

string.len(“abcd”)

4

rep

返回字符串s的n个拷贝

string.rep(“abcd”,2)

abcdabcd

lower

返回字符串全部字母大写

string.lower(“AbcD”)

abcd

upper

返回字符串全部字母小写

string.upper(“AbcD”)

ABCD

format

返回一个类似printf的格式化字符串

string.format(“the value is:%d”,4)

the value is:4

sub

returns substring from index i to j of s

string.sub(“abcd”,2)

bcd

string.sub(“abcd”,-2)

cd

string.sub(“abcd”,2,-2)

bc

string.sub(“abcd”,2,3)

bc

find

在字符串中查找

string.find(“cdcdcdcd”,”ab”)

nil

string.find(“cdcdcdcd”,”cd”)

1   

string.find(“cdcdcdcd”,”cd”,7)

7   

gsub

在字符串中替换

string.gsub(“abcdabcd”,”a”,”z”);

zbcdzbcd   

string.gsub(“aaaa”,”a”,”z”,3);

zzza   

byte

返回字符的整数形式

string.byte(“ABCD”,4)

68

char

match

gmatch

将整型数字转成字符并连接

匹配出单条结果

匹配出多条结果

string.char(97,98,99,100)

string.match("a=svv12","=(%w+)")

string.gmatch( html1,"<img src='(.-)' />" );

abcd

svv12

匹配出所有img地址


基本模式串

字符类

描述

示例

结果

.

任意字符

string.find(“”,”.”)

nil

%s

空白符

string.find(“ab 

3   

%S

非空白符

string.find(“ab 

1   

%p

标点字符

string.find(“ab,.cd”,”%p%p”)

3   

%P

非标点字符

string.find(“ab,.cd”,”%P%P”)

1   

%c

控制字符

string.find(“abcd\t\n”,”%c%c”)

5   

%C

非控制字符

string.find(“\t\nabcd”,”%C%C”)

3   

%d

数字

string.find(“abcd12″,”%d%d”)

5   

%D

非数字

string.find(“12abcd”,”%D%D”)

3   

%x

十六进制数字

string.find(“efgh”,”%x%x”)

1   

%X

非十六进制数字

string.find(“efgh”,”%X%X”)

3   

%a

字母

string.find(“AB12″,”%a%a”)

1   

%A

非字母

string.find(“AB12″,”%A%A”)

3   

%l

小写字母

string.find(“ABab”,”%l%l”)

3   

%L

大写字母

string.find(“ABab”,”%L%L”)

1   

%u

大写字母

string.find(“ABab”,”%u%u”)

1   

%U

非大写字母

string.find(“ABab”,”%U%U”)

3   

%w

字母和数字

string.find(“a1()”,”%w%w”)

1   

%W

非字母非数字

string.find(“a1()”,”%W%W”)

3   

转义字符%

字符类

描述

示例

结果

%

转义字符

string.find(“abc%..”,”%%”)

4   

string.find(“abc..d”,”%.%.”)

4   

用[]创建字符集,”-”为连字符,”^”表示字符集的补集

字符类

描述

示例

结果

[01]

匹配二进制数

string.find(“32123″,”[01]“)

3   

[AB][CD]

匹配AC、AD、BC、BD

string.find(“ABCDEF”,”[AB][CD]“)

2   

[[]]

匹配一对方括号[]

string.find(“ABC[]D”,”[[]]”)

4   

[1-3]

匹配数字1-3

string.find(“312″,”[1-3][1-3][1-3]“)

1   

[b-d]

匹配字母b-d

string.find(“dbc”,”[b-d][b-d][b-d]“)

1   

[^%s]

匹配任意非空字符

string.find(“  a 

3   

[^%d]

匹配任意非数字字符

string.find(“123a”,”[^%d]“)

4   

[^%a]

匹配任意非字母字符

string.find(“abc1″,”[^%a]“)

4   

用”()”进行捕获

字符类

描述

示例

结果

()

捕获字符串

string.find(“12ab”,”(%a%a)”)

3    4   

string.find(“ab12″,”(%d%d)”)

3    4   

模式修饰符

修饰符

描述

示例

结果

+

表示1个或多个,匹配最多个

string.find(“aaabbb”,”(a+b)”)

1    4   

string.find(“cccbbb”,”(a+b)”)

nil

-

表示0个或多个,匹配最少个

string.find(“zzxyyy”,”(xy-)”)

3    3   

string.find(“zzzyyy”,”(x-y)”)

4    4   

*

表示0个或多个,匹配最多个

string.find(“mmmnnn”,”(m*n)”)

1    4   

string.find(“lllnnn”,”(m*n)”)

4    4   

?

表示0个或1个

string.find(“aaabbb”,”(a?b)”)

3    4   

string.find(“cccbbb”,”(a?b)”)

4    4   


字符串格式化 



Lua提供了string.format()函数来生成具有特定格式的字符串, 函数的第一个参数是格式(formatstring), 之后是对应格式中每个代号的各种数据. 由于格式字符串的存在, 使得产生的长字符串可读性大大提高了. 这个函数的格式很像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位. 



在这些参数的后面则是上述所列的转义码类型(c, d, i, f, ...). 以下是一些例子:




在这些参数的后面则是上述所列的转义码类型(c, d, i, f, ...). 以下是一些例子: 


string.format("%%c: %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


在魔兽世界中还有另一个string.format()参数, 允许不按后面的列出顺序读取参数. 在这种情况下, 使用参数的排位+$符号来指定特定的参数. 



(此语句在非WoW的Lua编译器中将不能正确运作. 请使用WoWLua或Lua511WoW) 例如: 



> print(string.format("%2$d, %1$d, %d", 13, 17)) 17, 13, 13


如果设定了$参数, 其必须紧接在%符号之后, 并且所有的后续参数(在这里指13, 17)都必须被访问; 换言之如果有3个参数, 不能只使用1$和3$. 可以混用含有$和不含$的转义符; 不含$的转义符将自动从参数列表的头部开始获取数据.  



$参数在实现本地化中非常方便. 在不同的语言中, 特定的名词可能会以不同顺序出现. 使用带有$参数的格式字符串, 可以使不同语言版本的客户端共用相同的参数列表. 例如下面这句游戏提示: 



Cladhaire's Shadow Word: Pain is removed. 在德语版客户端中是这样写的: 



'Shadow Word: Pain' von Cladhaire wurde entfernt.



在英文版中技能(暗言术·痛)出现在角色名称(Cladhaire)之后, 但在德语版中顺序正相反. 如果参数列表中角色名称是排在技能名称之前, 可以为不同的客户端分别写出如下的格式字符串: 英文版: %s's %s is removed. 



德文版: '%2$s' von %1$s wurde entfernt. 



这样只要向string.format()传入不同的格式字符串即可, 不需重写具有不同参数次序的语句.








.(点): 与任何字符配对 %a: 与任何字母配对 



%c: 与任何控制符配对(例如\n) 



%d: 与任何数字配对 



%l: 与任何小写字母配对 



%p: 与任何标点(punctuation)配对 



%s: 与空白字符配对 



%u: 与任何大写字母配对 



%w: 与任何字母/数字配对 



%x: 与任何十六进制数配对 



%z: 与任何代表0的字符配对 



%x(此处x是非字母非数字字符)