【原创】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
时间: 2024-10-29 17:21:22

【原创】Lua 语言中的模式匹配的相关文章

【COCOS2DX-LUA 脚本开发之一】LUA语言基础在COCOS2DX游戏中使用LUA脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2dx/681.html 对于游戏公司而言,采用游戏脚本lua.python等进行开发也很常见,但是很多童鞋对脚本并没有很熟悉的概念,本篇则向大家简单介绍脚本的用途以及在Cocos2dx基础用法: Lua和python这些详细介绍的话,请不太熟悉的童鞋自行百度百科哈,那么对于lua和python则是两个常用的脚本语言,

【 c语言中无符号和有符号的加法运算】【深入理解】--【sky原创】

原文:[ c语言中无符号和有符号的加法运算][深入理解]--[sky原创]   第一题 #include<stdio.h> int main() { unsigned int a=6; int b=-20; printf("%d\n",a+b); (a+b)>6? puts(">6"):puts("<=6"); return 0; }  答案是:>6   第二题 #include<stdio.h> 

Lua语言在Wireshark中使用(转)

1.       检查Wireshark的版本是否支持Lua 打开Wireshark,点击"HelpàAbout Wireshark"菜单,查看弹出的对话框,如果有"with Lua 5.1"表示支持Lua语言扩展,如果有"without Lua"表示不支持Lua扩展.   2.       启用LUA 在全局配置文件中启用LUA的方法是从init.lua文件中删除disable_lua这一行.该文件可以通过点击"HelpàAbout

C语言中调用Lua函数实例_Lua

记得上学时,初中英文课本中,上网叫做surfing the internet,中文叫网上冲浪.那个时期,人们经常称互联网为赛博空间.如今工作了,大量的零碎时间用于上微博,知乎,QQ,这些碎片化的阅读让人读起来轻松,也能获取些粗浅的信息.然而它们是消耗时间的黑洞,时间就这样一分一秒地飞逝,年末的时候,知乎会告诉你回答了多少问题,阅读了相当于一部<红楼梦>那么多的文字.只是当你静下来一想,这些浅阅读并没给你带来有深度,系统的知识.在你的时间线上,两条相邻信息往往是八竿子也打不着的.而且你还时不时去

【COCOS2DX-LUA 脚本开发之二】LUA语言基础

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/lua-game/1235.html 从今天开始,往后将陆续更新Lua教程,主要是搭载Cocos2dx ,有任何疑惑或者不对的地方,尽情指正.交流.探讨. 那么首先肯定是Lua语言基础的知识点,下面直接附上代码,注释已经很清楚,无需赘述. 这里顺便给大家推荐一款mac os上的文本编辑器,好用支持多语言编辑,oc,c,c++,java,lua

[Lua]Lua语言基础汇总(1) -- 类型与值

基础介绍 Lua是一种动态类型的语言.在语言中没有类型定义的语法,每个值都带有其自身的类型信息.在Lua中有8种基本类型,分别是: nil(空)类型 boolean(布尔)类型 number(数字)类型 string(字符串)类型 userdata(自定义类型) function(函数)类型 thread(线程)类型 table(表)类型 以上是Lua中的8中基本类型,我们可以使用type函数,判断一个值得类型,type函数返回一个对应类型的字符串描述.例如: 1 2 3 4 5 6 7 8 9

ios开发愤怒的小鸟的Lua语言:Wax框架详解

2011年6月的编程语言排行榜Lua语言一军突起,一举进入前十名.这与一年前苹果决定在iOS系统上使用Lua语言密不可分.但是,你了解如何用Lua语言在iOS上开发应用吗?将向各位介绍Lua语言的iOS应用开发框架--Wax,其中在iOS平台上无比火爆的<愤怒的小鸟>就是由Lua语言用Wax开发的.全文共分两部分,第一部分将带您深入探讨Wax具有的一些好处,同时演示把Lua与Xcode 4和iOS软件开发工具包(SDK)集成起来必不可少的实际步骤.第二部分将逐步介绍如何用Wax构建一个简单的应

[Lua]Lua语言基础汇总(4) -- 函数

Lua中的函数和C++中的函数的含义是一致的,Lua中的函数格式如下: 1 2 3 function MyFunc(param)      -- Do something end 在调用函数时,也需要将对应的参数放在一对圆括号中,即使调用函数时没有参数,也必须写出一对空括号.对于这个规则只有一种特殊的例外情况:一个函数若只有一个参数,并且此参数是一个字符串或table构造式,那么圆括号便可以省略掉.看以下代码: 1 2 3 4 5 6 print "Hello World"      

指针-c语言中字符数组初始化问题

问题描述 c语言中字符数组初始化问题 字符数组初始化1: char str[]=""123"";//不报错2: char str[4]; str=""123"";//不能将const char[4] to char[4]字符指针初始化1: char *str=""123"";//不报错2: char *str; str=""123"";//不报错求