lua正则表达式

与其他语言不同,Lua并不适用POSIX规范的正则表达式(也写作regexp)来进行模式匹配,主要原因是程序大小,POSIX表达式的实现要4000+行代码,比Lua标准库加在一起代码量还大,所以,Lua自己实现的
正则表达式只需要500行的代码,而且功能不弱,甚至比POSIX正则多了一些功能。
下面的表列出了Lua支持的所有字符类:
. 任意字符
%a 字母
%c 控制字符
%d 数字
%l 小写字母
%p 标点字符
%s 空白符
%u 大写字母
%w 字母和数字
%x 十六进制数字
%z 代表0的字符
上面字符类的大写形式表示小写所代表的集合的补集。例如, ‘%A’非字母的字符:
print(string.gsub(“hello, up-down!”, “%A”, “.”))
–> hello..up.down. 4 //gsub()会返回两个值,第一个值是替换后的字符串,第二个值是成功匹配的次数;但是如果在外面加上一个括号如(string.sub()),那结果就只是一个,那就是替换后的字符串
另外Lua表达式还支持一些特殊的字符,如下:
( ) . % + - * ? [ ^ $ //% 也作为以上特殊字符的转义字符,因此 ‘%.’ 匹配点。但是只有他们被用作模式串用于函数的时候,%′才作为转义字符
在char-set中可以使用范围表示字符的集合,第一个字符和最后一个字符之间用连字符连接表示这两个字符之间范围内的字符集合。大部分的常用字符范围都已经预定义好了,所以一般你不需要自己定义字符的集合。比如,'%d'表示 '[0-9]';'%x'表示'[0-9a-fA-F]'。然而,如果你想查找八进制数,你可能更喜欢使用'[0-7]'而不是'[01234567]'。你可以在字符集(char-set)的开始处使用
^′ 表示其补集: ‘[^0-7]’ 匹配任何不是八进制数字的字符; ‘[非换行符户的字符。记住,可以使用大写的字符类表示其补集: ‘%S’比’[^%s]’要简短些。我试过替换字符串中的控制符,空白符和单引号,可以这么写 string.gsub(srcStr, “[%c+%s+’+]”, “”)
可以使用修饰符来修饰模式增强模式的表达能力,Lua中的模式修饰符有四个:
+ 匹配前一字符1次或多次,最长匹配
* 匹配前一字符0次或多次,最长匹配
- 匹配前一字符0次或多次,最短匹配
? 匹配前一字符0次或1次
‘+’,匹配一个或多个字符,总是进行最长的匹配。
如,模式 ‘%a+’ 匹配一个或多个字母或者一个单词;
-′与′一样,都匹配一个字符的0次或多次出现,但是他进行的是最短匹配。某些时候这两个用起来没有区别,但有些时候结果将截然不同。比如,如果你使用模式’[_%a][_%w]-‘来查找标示符,你将只能找到第一个字母,因为’[_%w]-‘永远匹配空。另一方面,假定你想查找C程序中的注释,很多人可能使用 ‘/%.%/’ (也就是说 “/” 后面跟着任意多个字符,然后跟着 “/”). 然而,由于 ‘.‘进行的是最长匹配,这个模式将匹配程序中第一个”/” 和最后一个”*/”之间所有部分:
test = “int x; /* x / int y; / y */”
print(string.gsub(test, “/%.%*/”, “”))
–> int x;
然而模式 ‘.-‘进行的是最短匹配,她会匹配”/“开始到第一个”/”之前的部分:
test = “int x; /* x / int y; / y */”
print(string.gsub(test, “/%.-%/”, “”))
–> int x; int y;
?′匹配一个字符0次或1次.举个例子,假定我们想在一段文本内查找一个整数,整数可能带有正负号。 模式 '[+-]?%d+'符合我们的要求,她可以匹配 像 "-12", "23" 和 "+1009"等数字. '[+-]' 是一个匹配+′或者 -′的字符类;
^′开头的模式只匹配目标串的开始部分,相似的,以$′结尾的模式只匹配目标串的结尾部分。这不仅可以用来限制你要查找的模式,还可以定位(anchor)模式。比如:
if string.find(s, "^%d") then ...
检查字符串s是否以数字开头,而
if string.find(s, "^[+-]?%d+$") then ...
检查字符串s是否是一个整数。
'%b'用来匹配对称的字符.常写为 '%bxy',x和y是任意两个不同的字符;x作为匹配的开始,y作为匹配的结束。比如, '%b()'匹配以
(′开始, 以 `)′结束的字符串:
print(string.gsub(“a (enclosed (in) parentheses) line”, “%b()”, “”))
–> a line
常用的这种模式有: ‘%b()’, ‘%b[]’, ‘%b%{%}’,和 ‘%b<>’。你也可以使用任何字符作为分隔符。
最后还有一种用法,%数字,数字表示第几个匹配项,如下例子:
%1 表示符合模式的第一个匹配
x = string.gsub(“hello world”, “(%w+)”, “%1 %1”)
–> x=”hello hello world world”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值