在Lua中有很多字符分类:
. | 所有字符 |
%a | 字母 |
%c | 控制字符 |
%d | 数字 |
%l | 小写字母 |
%p | 标点符号 |
%s | 空白字符 |
%u | 大写字母 |
%w | 字母和数字字符 |
%x | 十六进制数字 |
%z | 内部表示为0的字符 |
print(string.gsub("hello,up-down!","%A","."))
--> hello..up.down. 4
后面那个4是替换次数。
在模式中还有一些字符被称为“魔法字符”,他们具有特殊的意义:( ) . % + - * ? [ ] ^ $
字符%是转义字符。
“%.”代表匹配一个点
“%%”代表匹配字符%本身
其实,在Lua里面模式就是字符串,和其他字符串没什么区别,但是只有模式函数才会解释那些符合模式字符串规则的字符串。
在一对方括号内将不同的字符分类或单个字符组合起来,即可创建出属于用户自己的字符分类,这种新的字符分类叫做字符集(char-set)。比如说"[%w_]"表示同时匹配字母、数字和下划线;字符集"[01]"表示匹配二进制数字;字符集"[%[%]]"表示匹配方括号本身。
如果要统计一段文本中元音的数量,可以这么写:
count=select(2,string.gsub(text,"[AEIOUaeiou]",""))
在字符集中包含一段字符范围的做法是写出字符范围的第一个字符和最后一个字符,并用横线连接,例如"[0-9]","[0-9a-fA-F]",这种方式也可以用%d和%x表示。在一个字符集前面几上'^',就可以得到这个字符集的补集,例如"[^0-7]"表示所有非八进制数字的字符。对于简单的分类,使用其大写形式也可以得到补集。
Lua中提供修饰符来描述模式中的重复部分和可选部分,如下:
+ | 重复一次或多次 |
* | 重复0次或多次 |
- | 也是重复0次或多次 |
? | 可选部分(出现0次或1次) |
修饰符'-'和'*'一样,也是用于匹配属于字符分类的0个和多个字符的。不过它会匹配最短的子串。
"?"可用于匹配一个可选的字符。例如,要在一段文本中寻找一个整数,而这个整数可以包括一个可选的正负号。那么使用模式"[+-]?%d+"就可以完成这项任务,这个[+-]是一个匹配'+'和'-'号的字符分类,后面的?说明这个参数是可选的。
如果模式以一个'^'起始,那么它只会匹配目标字符串的开头部分。类似地,如果模式以'$'结尾,那么它只会匹配目标字符串的结尾部分。
if string.find(s,"^%d") then ... --检查字符串s是否以一个数字开头
if string.find(s,"^[+-]?%d+$") then ... --检查这个字符串是否表示一个整数,并且没有多余的前导字符和结尾字符
另外,在模式中,还可以使用"%b",用于匹配成对的字符。它的写法是"%b<x><y>",其中<x><y>是两个不同的字符,<x>作为一个起始字符,<y>作为一个结束字符。例如,模式"%b()"可匹配以'('开始,并以')'结束的子串;
这种模式的典型用法包括"%b()","%b[]","%{}","%b<>"但实际上可以用任何字符作为分隔符。