基本函数
函数 | 描述 | 示例 | 结果 |
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是非字母非数字字符)