《易语言“正则表达式”教程》本文改编自多个文档,因此如有雷同,不是巧合。
“正则表达式”的应用范围越来越广,有了这个强大的工具,我们可以做很多事情,如搜索一句话中某个特定的数据,屏蔽掉一些非法贴子的发言,网页中匹配特定数据,代码编辑框中字符的高亮等等,这都可以用正则表达式来完成。
本书分为四个部分。
第一部分介绍了易语言的正则表达式支持库,在这里,大家可以了解第一个正则表达式的易语言程序写法,以及一个通用的小工具的制作。
第二部分介绍了正则表达式的基本语法,大家可以用上述的小工具进行试验。
第三部分介绍了用易语言写的正则表达式工具的使用方法。
这些工具是由易语言用户提供的,有的工具还带有易语言源码。
他们是:monkeycz、零点飞越、寻梦。
第四部分介绍了正则表达式的高级技巧。
目录《易语言“正则表达式”教程》 (1)目录 (1)第一章易语言正则表达式入门 (3)一.与DOS下的通配符类似 (3)二.初步了解正则表达式的规定 (3)三.一个速查列表 (4)四.正则表达式支持库的命令 (5)4.1第1个正则表达式程序 (5)4.2第2个正则表达式例程 (7)4.3第3个例程 (8)4.4一个小型的正则工具 (9)第二章揭开正则表达式的神秘面纱 (11)引言 (12)一.正则表达式规则 (12)1.1普通字符 (12)1.2简单的转义字符 (13)1.3能够与“多种字符”匹配的表达式 (14)1.4自定义能够匹配“多种字符”的表达式 (16)1.5修饰匹配次数的特殊符号 (17)1.6其他一些代表抽象意义的特殊符号 (20)二.正则表达式中的一些高级规则 (21)2.1匹配次数中的贪婪与非贪婪 (21)2.2反向引用\1,\2 (23)2.3预搜索,不匹配;反向预搜索,不匹配 (24)三.其他通用规则 (25)四.其他提示 (27)第三章正则表达式工具与实例 (28)一.正则表达式支持库 (29)1.1“正则表达式”数据类型 (29)1.2“搜索结果”数据类型 (30)二.正则表达式实用工具 (30)2.1一个成品工具 (30)2.2易语言写的工具 (33)三.应用实例 (34)3.1实例1 (34)3.2实例2 (36)3.3实例3 (37)3.4实例4 (37)第四章正则表达式话题 (38)引言 (38)一.表达式的递归匹配 (38)1.1匹配未知层次的嵌套 (38)1.2匹配有限层次的嵌套 (39)二.非贪婪匹配的效率 (40)2.1效率陷阱的产生 (40)2.2效率陷阱的避免 (41)附录: (42)一.17种常用正则表达式 (42)第一章易语言正则表达式入门一.与DOS下的通配符类似其实,所谓的“正则表达式”,是大家一直在使用的,记得吗?在搜索文件时,会使用一种威力巨大的武器——DOS通配符——“?”和“*”。
这就是最常用的正则表达式。
例如:123.*表示所有文件名为123的文件,如123.txt,123.doc,123.wps, 123.swf,123.xls等。
“中国?.doc”表示所有文件名类似于中国1.doc、中国2.doc、中国x.doc 这样的文件。
上述DOS下的通配符用“?”号代表一个字符,“*”号代表任意个字符,但在正则表达式中,可能这些都有些改变。
如“*”号匹配的就不一样。
下面看看正则表达式是如何规定的吧。
二.初步了解正则表达式的规定正则表达式正是在“DOS通配符”基础上复杂化而得到的。
其最常用的表达式可能是:*匹配0或多个正好在它之前的那个字符。
例如a*意味着能够匹配任意数量的a字符.匹配任何单个字符。
例如r.t匹配这些字符串:rat、rut、r t,但是不匹配root(等同于DOS通配符下的?号。
)^匹配一行的开始。
例如^When能够匹配字符串"When in the course of human events"的开始,但是不能匹配"What and When in the"。
$匹配行结束符。
例如正则表达式weasel$能够匹配字符串"He's a weasel"的末尾,但是不能匹配字符串"They are a bunch of weasels."。
在这些字符中,可以使用\.来表示.,\*表示*,不过,这种情况出现得很少,如果不能理解,可以暂时不理它,到用的时候就明白了。
正则表达式还有一个强大的符号:[],这个[]所括的内容,可以不按顺序进行匹配。
如[abc]匹配abc,acb,bac,bca,cab,cba这6个文本[0-9]匹配任意0到9的数字[a-z]匹配所有小写字母[A-Z]匹配所有大写字母当然,你可以把它们混在一起写成[a-z0-9]这种样子。
很多时候,我们需要检查文本中的非数字,我们就可以使用^这个符号,表示“除了……”[^0-9]匹配所有非数字文本[^a-zA-Z]匹配所有非字母的文本[^FONT]匹配所有不含FONT的文本三.一个速查列表下面用一个表来表示:*前面元素出现0次以上.匹配任何单个字符?前面元素出现0次或1次+前面元素出现1次以上^表示开头。
$表示结尾。
.*表示0个以上的任意字符。
[]范围描述符。
[a-z]表示从a到z之间的任意一个。
\w英文字母和数字。
即[0-9A-Z a-z]。
\W非英文字母和数字\s空字符,即[\t\n\r\f]。
\S非空字符。
\d数字,即[0-9]。
\D非数字。
\b词边界字符(在范围描述符外部时)\B非词边界字符\b退格符(0x08)(在范围描述符内部时){m,n}前面元素最少出现m次,最多出现n次|选择()群组其他字符该字符本身四.正则表达式支持库的命令基本的规则这些也就够了。
下面将讲一讲易语言中正则表达式的数据类型和几个相关命令,相关的数据类型有两个:正则表达式和搜索结果。
如下图所示:4.1第1个正则表达式程序新建一个易语言程序,界面设计如下图所示:按钮被单击事件代码如下:.局部变量正则表达式1,正则表达式正则表达式1.创建(“A.C”,假)编辑框2.内容=到文本(正则表达式1.匹配(编辑框1.内容))如下图所示:在这里,“正则表达式1”是一个正则对象,使用“创建”方法建议了一个“A.C”正则表达式,然后与编辑框1中的内容进行正则比较,最后得出结论。
运行后,大家只要输入三个字符,前为A后为C都会返回真。
如下图所示:但如果是小写或多于三个字符,那么返回就会是假。
如下图所示:大家也许会问,这样匹配有意义吗?我只能说,有没有意义只在于你怎么用了,如:可用于程序加密时,不采用判断语句,也不采用循环语句,而是用正则去匹配是否注册成功,以及可以进行程序名称的检查,程序中一些文字的检查等,这可能让一些不会正则的破解者很难下手。
4.2第2个正则表达式例程通过第一个正则程序,大家会了解正则匹配的重要性,也了解了易语言正则支持库的基本使用方法,下面这个例程可以让大家了解正则会返回一些更多的内容,大家如何去取回这些信息呢。
下面改动上述程序中的一些代码为以下:.局部变量正则表达式1,正则表达式.局部变量搜索结果1,搜索结果,,"0"正则表达式1.创建(“A.C”,假)搜索结果1=正则表达式1.搜索全部(编辑框1.内容)编辑框2.内容=搜索结果1[1].取匹配文本(编辑框1.内容,)改动后如下所示:在这里,增加了一个搜索结果的对象,用这个对象接收正则表达式匹配的结果,然后从中提取出大家想要的数据。
上述易语言代码的运行结果如下图所示:改动上面编辑框的内容后,结果如下:这次是较为重要的一环,即我们知道了取回的内容。
即由A和C包含的内容。
以及下面会论述到的位置信息。
取回的包含的内容意义重大,如:可以取回一对括号内的内容,这也是为了查找的方便。
4.3第3个例程这次的工作任务是取一批文字中的所有字母与数字内容。
按钮被单击事件代码如下:.局部变量正则表达式1,正则表达式.局部变量搜索结果1,搜索结果,,"0".局部变量数组索引,整数型正则表达式1.创建(“[a-z0-9”+#换行符+“]”,假)'[]中间的内容,就是要搜索的内容,可以是任意字符,包括换行、空格、特殊符号.但注意如果有字符"^",就表示"除了",如"[^abc]"表示"除了abc",现在,我们给出的表达式意思是匹配含字母、数字、换行符的文本,后面那个"假"意思是不区分大小写,你写成真也没有问题。
搜索结果1=正则表达式1.搜索全部(编辑框1.内容)'搜索结果是个数组,实际上存放的是字符串搜索后的各种参数,例如位置等,可以用"取匹配文本(,)"方法将其取出,注意它的第一个参数必须和"搜索全部()"的参数一致编辑框2.内容=“”.计次循环首(取数组成员数(搜索结果1),数组索引)编辑框2.加入文本(搜索结果1[数组索引].取匹配文本(编辑框1.内容,)).计次循环尾()图片如下所示:运行后,大家可以在上面的编辑框中输入中文与字母数字的混合,点击按钮后,就可以从中提取出字母与数字了。
运行效果如下图所示:4.4一个小型的正则工具在这里,大家将学会制作一个小型的正则表达式工具,使用这个工具进行下面章节更加细致的学习。
这个例程也可以在本书的随书光盘中找到。
程序界面如下所示安排:按钮被单击事件的代码如下:.局部变量正则表达式1,正则表达式.局部变量搜索结果1,搜索结果,,"0".局部变量位置1,整数型正则表达式1.创建(组合框1.内容,假).如果真(正则表达式1.是否为空()=真)连续赋值(“”,编辑框A.内容,编辑框B.内容,编辑框C.内容,编辑框D.内容,编辑框2.内容)返回().如果真结束编辑框2.内容=到文本(正则表达式1.匹配(编辑框1.内容))搜索结果1=正则表达式1.搜索全部(编辑框1.内容).如果真(取数组下标(搜索结果1,)=0)连续赋值(“”,编辑框A.内容,编辑框B.内容,编辑框C.内容,编辑框D.内容,编辑框2.内容)返回().如果真结束编辑框A.内容=搜索结果1[1].取匹配文本(编辑框1.内容,位置1)编辑框B.内容=到文本(位置1)编辑框C.内容=到文本(位置1+取文本长度(编辑框A.内容))编辑框D.内容=到文本(取文本长度(编辑框A.内容))抓图如下:通过上述代码后,运行效果如下:上述是测试“匹配”方法中注释的内容:正则表达式.创建(“易语言4\.0(模块|支持库)?”)信息框(正则表达式.匹配(“易语言4.0支持库”),0,)在第二章中,大家会发现本书大量用到了这个小程序。