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

简介:

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

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

字符类 -- 指可以匹配一个特定字符集合内任何字符的模式项。  
?
1
2
3
4
5
6
7
8
9
10
11
. 任意字符
%a 字母
%c 控制字符
%d 数字
%l 小写字母
%p 标点字符
%s 空白符
%u 大写字母
%w 字母和数字
%x 十六进制数字
%z 代表0的字符
上面字符类的大写形式表示小写所代表的集合的补集。

特殊字符 - 模式匹配中的特殊字符
?
1
( ) . % + - * ? [ ^ $
        '%' 用作特殊字符的转义字符,因此 '%.' 匹配点;'%%' 匹配字符 '%'。转义字符 '%'不仅可以用来转义特殊字符,还可以用于所有的非字母的字符。当对一个字符有疑问的时候,为安全起见请使用转义字符转义他。  
       如果你需要在一个模式串内放置引号的话,你必须使用在其他的字符串中放置引号的方法来处理,使用 '\转义引号,'\' 是 Lua 的转义符。  
       可以使用方括号将字符类或者字符括起来创建自己的字符类(或称之为 char-set)。比如,'[%w_]' 将匹配字母数字和下划线,'[01]' 匹配二进制数字,'[%[%]]' 匹配一对方括号。  
       在 char-set 中可以使用范围表示字符的集合,第一个字符和最后一个字符之间用连字符连接表示这两个字符之间范围内的字符集合。  
       可以在字符集(char-set)的开始处使用 '^' 表示其补集:'[^0-7]' 匹配任何不是八进制数字的字符;'[^\n]' 匹配任何非换行符户的字符。记住,可以使用大写的字符类表示其补集:'%S' 比 '[^%s]' 要简短些。  
       Lua的字符类依赖于本地环境,所以 '[a-z]' 可能与 '%l' 表示的字符集不同。  

模式修饰符 - 可以使用修饰符来修饰模式增强模式的表达能力  
?
1
2
3
4
+ 匹配前一字符1次或多次
* 匹配前一字符0次或多次
- 匹配前一字符0次或多次
? 匹配前一字符0次或1次
'+',匹配一个或多个字符,总是进行最长的匹配。  
'*' 与 '+' 类似,但是他匹配一个字符0次或多次出现.一个典型的应用是匹配空白。  
'-' 与 '*' 一样,都匹配一个字符的0次或多次出现,但是进行的是最短匹配。  
'?' 匹配一个字符0次或1次。  

以 '^' 开头的模式只匹配目标串的开始部分,相似的,以 '$' 结尾的模式只匹配目标串的结尾部分。这不仅可以用来限制你要查找的模式,还可以定位(anchor)模式。  
'%b' 用来匹配对称的字符。常写为 '%bxy' ,x和y是任意两个不同的字符;x作为匹配的开始,y作为匹配的结束。常用的这种模式有:'%b()' ,'%b[]','%b%{%}' 和 '%b<>'。你也可以使用任何字符作为分隔符。  


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

Capture 机制 - 可以使用模式串的一部分匹配目标串的一部分。将你想捕获的模式用圆括号括起来,就指定了一个capture。  
例如,在string.find使用captures的时候,函数会返回捕获的值作为额外的结果。这常被用来将一个目标串拆分成多个:  
pair = "name = Anna"
_, _, key, value = string.find(pair, "(%a+)%s*=%s*(%a+)")
print(key, value) --> name Anna
date = "17/7/1990"
_, _, d, m, y = string.find(date, "(%d+)/(%d+)/(%d+)")
print(d, m, y) --> 17 7 1990

目录
相关文章
|
NoSQL Redis
Redis下Lua脚本的复制模式
假设我们的Redis选择了主从架构, 和AOF持久化方式。我们执行一条写命令时, 该条命令会被发送到从服务器, 和追加到AOF文件中。当我们执行的不是一条命令, 而是Lua脚本时, 默认情况下, 整个Lua脚本的内容会进行复制, 但是存在一些特殊情况。
1931 0
Redis下Lua脚本的复制模式
|
5月前
|
NoSQL Redis
RedisTemplate执行lua脚本在Redis集群模式下报错EvalSha is not supported in cluster environment.
RedisTemplate执行lua脚本在Redis集群模式下报错EvalSha is not supported in cluster environment.
155 0
|
存储 缓存 NoSQL
一文讲透 Redis 事务 (事务模式 VS Lua 脚本)
先说结论: Redis 的事务模式具备如下特点: - 保证隔离性; - 无法保证持久性; - 具备了一定的原子性,但不支持回滚; - 一致性的概念有分歧,假设在一致性的核心是约束的语意下,Redis 的事务可以保证一致性。 但 Lua 脚本更具备实用场景,它是另一种形式的事务,他具备一定的原子性,但脚本报错的情况下,事务并不会回滚。Lua 脚本可以保证隔离性,而且可以完美的支持**后面的步骤依赖前面步骤的结果**。
24207 2
一文讲透 Redis 事务 (事务模式 VS Lua 脚本)
|
存储 缓存 自然语言处理
小刚带你深入浅出理解Lua语言
前言这篇文章并不是针对某个知识点深入剖析,而是聚焦在Lua语言的关键知识点覆盖和关键使用问题列举描述。能够让学习者对Lua整体有个认识(使用一门新的语言不仅仅在用的时候适应它,而是知道怎么善于使用它),同时也可以作为一个工具文档在Lua中遇到具体问题的时候能从这里索引到相应的知识点和Lua的一些原理,得到启发。 1、Lua语言的特点简单的说Lua语言是一个可扩展的嵌入型的脚本语言。它具有以下的特点
小刚带你深入浅出理解Lua语言
lua语言——协同程序(协程)
lua语言——协同程序(协程)
105 0
lua语言——特殊用法
lua语言——特殊用法
194 0
|
存储
lua语言——多脚本执行
lua语言——多脚本执行
217 0
|
索引 容器
lua语言——迭代器
lua语言——迭代器
105 0
|
Java 索引
Lua语言——table(表)
Lua语言——table(表)
126 0
|
C语言 索引
lua语言——函数
lua语言——函数
117 0