Lua中的字符串库实现了很强大的功能。
如:大小写转换、提取子字符串、检索字符串、模式匹配和URL编码等。
字符串库中的所有函数都导出在模块string中。
一、基础字符串函数
1.string.len( str ) 可以返回字符串str的长度。
2.string.rep( str, n ) 可返回字符串str重复 n 次的结果。
3.string.upper( str ) 将小写转为大写。
4.string.lower( str ) 将大写转为小写。
5.string.sub( str, start, end ) 可以从字符串 str 中提取从 start 到 end 的字符
如果是索引是负数,则从尾部开始。也可写成:str:sub( i ), end默认为 -1
6.string.char( ... ) 可以接收多个整数,并将之转换成对应的字符(ASCII码),
然后返回一个由这些字符连接成的字符串。如:
i = 99
print( string.char( i, i+1, i+2) ) --->cde
7.string.byte( str, i[, j ] ) 可以接收三个参数,其中第三个参数 j 是可选的,该函数返回
字符串 str 中第 i 个字符的ASCII码,或者从 i 到 j 之间的所有字符的 ASCII码 。
8.string.format( " 格式字符 ”,variable ) 是用于格式化字符串的利器,经常会用在输出上。
格式控制要以%开始,‘d '表示十进制,’ x ‘表示十六进制,’ o ‘用于八进制,
’ f ’用于浮点数,‘ s ’用于字符串,还可以在字母前面指定数字的精度,如:
print( string.format( " pi = %.4f ", math.pi ) ----> pi = 3.1416
d = 5; m = 11; y = 1990
print( string.format( " %02d/%02d/%04d/ ", d, m, y ) ----> 05/11/1990 , %02d 表示至少有两位数,不足两位用0补齐
二、模式匹配(pattern-matching)
字符串库中最强大的函数是 find、match、gsub(global substitution)和 gmatch,它们都是基于模式的。
先总结一下模式:
这里的模式其实就是正则表达式,用于字符串搜索匹配。
(1)字符分类:
. | 所有字符 |
%a | 字母 |
%c | 控制字符 |
%d | 数字 |
%l | 小写字母 |
%p | 标点符号 |
%s | 空白字符 |
%u | 大写字母 |
%w | 字母和数字字符 |
%x | 十六进制数字 |
%z | 内部表示为0的字符 |
(2)魔法字符
( ) . % + - * ? [ ] ^ $
这些字符具有特殊意义:
% 作为这些魔法字符的转义符。“ %. ”表示匹配一个点,“ %% ”表示匹配 % 本身。
[ ] 将不同的字符分类或单个字符组合起来,即可创建属于用户自己的字符分类,叫“ 字符集 ”。
如:[ %w_ ] 表示同时匹配字母、数字和下划线。
[ 01 ] 表示匹配二进制数字。
[ %[%] ] 表示匹配方括号本身。
如果在一个字符集最前面加一个 ^ ,就可以得到这个字符集的补集,如:
[ ^\n ] 表示除了换行符以外的其他字符。
如果把 ^ 放在一个模式的起始位置,纳闷它只会匹配目标字符的开头部分,如:
” ^%d " 可匹配以数字开头的字符串,如:
[ ^[+ -]?%d+$ ] 可匹配一个整数(有正负号)。
如果模式以 $ 结尾,那么它只匹配目标字符串的结尾部分。
+ 表示重复 1 次或多次
* 表示重复 0 次或多次
- 和 * 一样,表示重复 0 次或多次
? 表示重复 0 次或 1 次
这四个修饰符放在一个模式的后面来描述模式中的重复部分和可选部分。
其中, * 和 - 虽然功能一样,但是匹配结果有一些区别:
* 会尽可能多的扩展,如:
test = " int x; /* x */ int y; /* y */
print ( string.gsub( test, " /%*.*%/ ", "<comment> " ) ) ----> int x; <comment>
- 则会尽可能少的扩展,如:test = " int x; /* x */ int y; /* y */
print ( string.gsub( test, " /%*.-%/ ", "<comment> " ) ) ----> int x; <comment> int y; <comment>
%b( ) 匹配以左括号开始并以右括号结尾的字符串
s = " a (enclosed (in) parentheses) line "
print ( string.gsub( s, " %b( ) ", " " ) ) ----> a line
类似的还有:%b{ } %b[ ] %b< >
1. string.find ( str, pattern[, index ] ),在字符串str中查找匹配模式pattern的子字符串,并返回匹配到的
起始索引和结尾索引,如果没有找到就返回 nil 。第三个参数是可选的,表示从字符串的哪个位置开始搜索。
2. string.match ( str, pattern ),表示在字符串str中查找匹配模式pattern的子字符串,并返回匹配到的字符串。
如:
date = " Today is 17/7/1990 "
d = string.match ( date, " %d+/%d+/%d+ " )
print ( d ) ---> 17/7/1990
可见,当用模式进行搜索时,该函数的功能很强大。
3. string.gsub( str, sub, replace[, time ]),表示在字符串str中出现子字符串sub替换为replace,
并返回替换的次数。还有一个可选的参数time,表示指定替换的次数。
s = string.gsub( " all lii ", " l ", " x ", 1 )
print( s ) ----> axl lii , 如果不指定替换次数,那么就会把所有的l都替换为x
4. string.gmatch( str, pattern ),在字符串str中查找匹配模式pattern的子字符串, 它会返回一个函数,
通过这个函数可以遍历到一个字符串中所有出现指定模式的地方。