(转载)lua的字符串及字符串格式化
原文链接
字符串的表示
- ""
- ''
- [[]]
- 被以上三项框起来的内容即为string, 当选用其上的任意一种方式来表示字符串的时候,如果要字符串中包含它本身的符号,则需要转义。
举个例子:
print("'I love Crane_Moker'")
输出:‘I love Crane_Mocker’
而print(""lua is a nice language"")
则会报错print("\"single dog\"")
输出"single dog"string.format()
这个函数类似于lua他妈妈,c语言中的printf(),提供了格式化的选择
举个例子:print(string.format("Happy %d", 1024))
输出:Happy 1024
注意,这里字符串"Happy 1024"是执行了函数string.format()的返回值,要想在终端显示它,还需要print()参数 解释 %c 接受一个数字, 并将其转化为ASCII码表中对应的字符 %d, %i 接受一个数字并将其转化为有符号的整数格式 %o 接受一个数字并将其转化为八进制数格式 %u 接受一个数字并将其转化为无符号整数格式 %x 接受一个数字并将其转化为十六进制数格式, 使用小写字母 %X 接受一个数字并将其转化为十六进制数格式, 使用大写字母 %e 接受一个数字并将其转化为科学记数法格式, 使用小写字母e %E 接受一个数字并将其转化为科学记数法格式, 使用大写字母E %f 接受一个数字并将其转化为浮点数格式 %g(%G) 接受一个数字并将其转化为%e(%E, 对应%G)及%f中较短的一种格式 %q 接受一个字符串并将其转化为可安全被Lua编译器读入的格式 %s 接受一个字符串并按照给定的参数格式化该字符串 这里还有在%之后以控制格式的参数
参数 解释 不带该参数的默认情况 + 其后的数字转义符将让正数显示正号 只有负数显示符号 0 指定了字串宽度时用0占位 空格占位 - 左对齐 右对齐 (m).(n) m字串裁切位数,n小数保留位数 匹配模式
string.gmatch(str, pattern)和string.match(str, pattern, init)
string.gmatch()有迭代器,可以匹配目标str中的所有符合pattern要求的部分(在for循环之类的里面使用这个会是不错的选择)。
而string.match()则只能匹配第一个,init决定了开始匹配的位置,默认是1(不要忘记了,在lua的table中默认以1开始哦)匹配的pattern ?
参数 匹配 .(点) 与任何字符配对 %a 与任何字母配对 %c 与任何控制符配对(例如\n) %d 与任何数字配对 %l 与任何小写字母配对 %p 与任何标点(punctuation)配对 %s 与空白字符配对 %u 与任何大写字母配对 %w 与任何字母/数字配对 %x 与任何十六进制数配对 %z 与任何代表0的字符配对 %x(此处x是非字母非数字字符) 与字符x配对. 主要用来处理表达式中有功能的字符(^$()%.[]*±?)的配对问题, 例如%%与%配对 [数个字符类] 与任何[]中包含的字符类配对. 例如[%w_]与任何字母/数字, 或下划线符号(_)配对 [^数个字符类] 与任何不包含在[]中的字符类配对. 例如[^%s]与任何非空白字符配对 lua中特殊字符有
( ) . % + - * ? [ ^ $
, 所以匹配是就需要%来转义,即上表中的%x模式条目
符号 涵义 * 将匹配零或多个该类的字符。 这个条目总是匹配尽可能长的串 + 将匹配一或更多个该类的字符。 这个条目总是匹配尽可能长的串 - 将匹配零或更多个该类的字符。 和 ‘*’ 不同, 这个条目总是匹配尽可能短的串 ? 将匹配零或一个该类的字符。 只要有可能,它会匹配一个 %n 这里的 n 可以从 1 到 9; 这个条目匹配一个等于 n 号捕获物(后面有描述)的子串。 %bxy 这里的 x 和 y 是两个明确的字符; 这个条目匹配以 x 开始 y 结束, 且其中 x 和 y 保持 平衡 的字符串。 意思是,如果从左到右读这个字符串,对每次读到一个 x 就 +1 ,读到一个 y 就 -1, 最终结束处的那个 y 是第一个记数到 0 的 y。 举个例子,条目 %b() 可以匹配到括号平衡的表达式。 %f[set] 指 边境模式; 这个条目会匹配到一个位于 set 内某个字符之前的一个空串, 且这个位置的前一个字符不属于 set 。 集合 set 的含义如前面所述。 匹配出的那个空串之开始和结束点的计算就看成该处有个字符 ‘\0’ 一样。 上面这个表是什么意思呢?不妨让我用*和+为大家举个例子:
print(string.match("Hello 1024", "%d"))
我们知道,string.match只匹配匹配到的第一个,所以这里可以匹配到符合pattern的部分,也就是在该字符串中的第一个数字1,所以输出为1
print(string.match("Hello 1024", "%d+"))
, 加号使条目尽可能长,所以这里输出为1024
print(string.match("Hello 1024", "%d*"))
, 由于*可以匹配到0个或多个该类字符,在这个字符串里,当然是先遇到了H,所以这里没有输出而
print(string.match("1024Hello", "%d*"))
, 就可以愉快输出1024啦顺嘴一提 string.char(arg) 和 string.byte(arg[,int])
string.char()有一个或多个参数,顾名思义,是将数字转化为字符,当然,它可以将它们连起来,成为str
string.byte()则将字符串的第指定(init)个字符返回对应的ascii码,默认是第一个