天天看点

【原创】Lua 语言中的模式匹配

       与其他脚本语言不同的是,lua 并不使用符合 posix 规范的正则表达式(也写作 regexp)来进行模式匹配。然而,lua 中的模式匹配功能是很强大的,并且包含了一些标准 posix 模式匹配不容易实现的功能。 

用于模式匹配的模式串的构成: 

字符类 -- 指可以匹配一个特定字符集合内任何字符的模式项。 

<a href="http://my.oschina.net/moooofly/blog/112446#">?</a>

1

2

3

4

5

6

7

8

9

10

11

<code>. 任意字符</code>

<code>%a 字母</code>

<code>%c 控制字符</code>

<code>%d 数字</code>

<code>%l 小写字母</code>

<code>%p 标点字符</code>

<code>%s 空白符</code>

<code>%u 大写字母</code>

<code>%w 字母和数字</code>

<code>%x 十六进制数字</code>

<code>%z 代表0的字符</code>

上面字符类的大写形式表示小写所代表的集合的补集。

特殊字符 - 模式匹配中的特殊字符

<code>( ) . % + - * ? [ ^ $</code>

        '%' 用作特殊字符的转义字符,因此 '%.' 匹配点;'%%' 匹配字符 '%'。转义字符 '%'不仅可以用来转义特殊字符,还可以用于所有的非字母的字符。当对一个字符有疑问的时候,为安全起见请使用转义字符转义他。 

       如果你需要在一个模式串内放置引号的话,你必须使用在其他的字符串中放置引号的方法来处理,使用 '\' 转义引号,'\' 是 lua 的转义符。 

       可以使用方括号将字符类或者字符括起来创建自己的字符类(或称之为 char-set)。比如,'[%w_]' 将匹配字母数字和下划线,'[01]' 匹配二进制数字,'[%[%]]' 匹配一对方括号。 

       在 char-set 中可以使用范围表示字符的集合,第一个字符和最后一个字符之间用连字符连接表示这两个字符之间范围内的字符集合。 

       可以在字符集(char-set)的开始处使用 '^' 表示其补集:'[^0-7]' 匹配任何不是八进制数字的字符;'[^\n]' 匹配任何非换行符户的字符。记住,可以使用大写的字符类表示其补集:'%s' 比 '[^%s]' 要简短些。 

       lua的字符类依赖于本地环境,所以 '[a-z]' 可能与 '%l' 表示的字符集不同。 

模式修饰符 - 可以使用修饰符来修饰模式增强模式的表达能力 

<code>+ 匹配前一字符1次或多次</code>

<code>* 匹配前一字符0次或多次</code>

<code>- 匹配前一字符0次或多次</code>

<code>? 匹配前一字符0次或1次</code>

'+',匹配一个或多个字符,总是进行最长的匹配。 

'*' 与 '+' 类似,但是他匹配一个字符0次或多次出现.一个典型的应用是匹配空白。 

'-' 与 '*' 一样,都匹配一个字符的0次或多次出现,但是进行的是最短匹配。 

'?' 匹配一个字符0次或1次。 

以 '^' 开头的模式只匹配目标串的开始部分,相似的,以 '$' 结尾的模式只匹配目标串的结尾部分。这不仅可以用来限制你要查找的模式,还可以定位(anchor)模式。 

'%b' 用来匹配对称的字符。常写为 '%bxy' ,x和y是任意两个不同的字符;x作为匹配的开始,y作为匹配的结束。常用的这种模式有:'%b()' ,'%b[]','%b%{%}' 和 '%b&lt;&gt;'。你也可以使用任何字符作为分隔符。 

============== 2013年3月9日 更新 ================== 

capture 机制 - 可以使用模式串的一部分匹配目标串的一部分。将你想捕获的模式用圆括号括起来,就指定了一个capture。 

例如,在string.find使用captures的时候,函数会返回捕获的值作为额外的结果。这常被用来将一个目标串拆分成多个: 

继续阅读