《易语言“正则表达式”教程》.docx

上传人:小飞机 文档编号:4927887 上传时间:2023-05-24 格式:DOCX 页数:43 大小:1.28MB
返回 下载 相关 举报
《易语言“正则表达式”教程》.docx_第1页
第1页 / 共43页
《易语言“正则表达式”教程》.docx_第2页
第2页 / 共43页
《易语言“正则表达式”教程》.docx_第3页
第3页 / 共43页
《易语言“正则表达式”教程》.docx_第4页
第4页 / 共43页
《易语言“正则表达式”教程》.docx_第5页
第5页 / 共43页
亲,该文档总共43页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《《易语言“正则表达式”教程》.docx》由会员分享,可在线阅读,更多相关《《易语言“正则表达式”教程》.docx(43页珍藏版)》请在三一办公上搜索。

1、易语言“正则表达式”教程本文改编自多个文档,因此如有雷同,不是巧合。“正则表达式”的应用范围越来越广,有了这个强大的工具,我们可以做很 多事情,如搜索一句话中某个特定的数据,屏蔽掉一些非法贴子的发言,网页中 匹配特定数据,代码编辑框中字符的高亮等等,这都可以用正则表达式来完成。本书分为四个部分。第一部分介绍了易语言的正则表达式支持库,在这里,大家可以了解第一个 正则表达式的易语言程序写法,以及一个通用的小工具的制作。第二部分介绍了正则表达式的基本语法,大家可以用上述的小工具进行试验。第三部分介绍了用易语言写的正则表达式工具的使用方法。这些工具是由易 语言用户提供的,有的工具还带有易语言源码。他

2、们是:monkeycz、零点飞越、 寻梦。第四部分介绍了正则表达式的高级技巧。目录易语言“正则表达式”教程1目录1第一章易语言正则表达式入门3一. 与DOS下的通配符类似3二. 初步了解正则表达式的规定3三. 一个速查列表4四. 正则表达式支持库的命令54.1第1个正则表达式程序54.2第2个正则表达式例程74.3第3个例程84.4 一个小型的正则工具9第二章揭开正则表达式的神秘面纱11引言12一. 正则表达式规则0121.1普通字符121.2简单的转义字符131.3能够与“多种字符”匹配的表达式141.4自定义能够匹配“多种字符”的表达式161.5修饰匹配次数的特殊符号171.6其他一些代表

3、抽象意义的特殊符号20二. 正则表达式中的一些高级规则212.1匹配次数中的贪婪与非贪婪212.2反向引用1, 2232.3预搜索,不匹配;反向预搜索,不匹配24三. 其他通用规则25四. 其他提示27第三章正则表达式工具与实例28一. 正则表达式支持库291.1 “正则表达式”数据类型291.2 “搜索结果”数据类型30二. 正则表达式实用工具302.1 一个成品工具302.2易语言写的工具33三. 应用实例343.1 实例1343.2 实例2363.3 实例3373.4 实例437第四章正则表达式话题38引言38一. 表达式的递归匹配381. 1匹配未知层次的嵌套381.2匹配有限层次的嵌

4、套39二. 非贪婪匹配的效率402.1效率陷阱的产生402.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下的通配符用“?”号代

5、表一个字符,*”号代表任意个字符,但在 正则表达式中,可能这些都有些改变。如*”号匹配的就不一样。下面看看正则 表达式是如何规定的吧。二. 初步了解正则表达式的规定正则表达式正是在“DOS通配符”基础上复杂化而得到的。其最常用的表达 式可能是:*匹配0或多个正好在它之前的那个字符。例如a*意味着能够匹配任意数量的a字符.匹配任何单个字符。例如r.t匹配这些字符串:rat、rut、r t,但是不 匹配root(等同于DOS通配符下的?号。)”匹配一行的开始。例如When能够匹配字符串When in the course of human events的开始,但是不能匹配What and When

6、 in the”。$匹配行结束符。例如正则表达式weasel$能够匹配字符串Hes 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 这种样子。很多

7、时候,我们需要检查文本中的非数字,我们就可以使用“这个符号,表示“除了”0-9匹配所有非数字文本a-zA-Z匹配所有非字母的文本FONT匹配所有不含FONT的文本三.一个速查列表卜面用一个表来表示:*前面元素出现0次以上.匹配任何单个字符?前面元素出现0次或1次+前面元素出现1次以上八表示开头。$表示结尾。.*表示0个以上的任意字符。范围描述符。a-z表示从a到z之间的任意一个。w英文字母和数字。即0-9 A-Z a-z。W非英文字母和数字s空字符,即tnrf。S非空字符。d数字,即0-9。D非数字。b词边界字符(在范围描述符外部时)B非词边界字符b退格符(0x08)(在范围描述符内部时)m,

8、n前面元素最少出现m次,最多出现n次1选择()群组其他字符该字符本身.正则表达式支持库的命令基本的规则这些也就够了。下面将讲一讲易语言中正则表达式的数据类型和 几个相关命令,相关的数据类型有两个:正则表达式和搜索结果。如下图所示:创是取取匹搜替搜多建否文子配索换索行为本表全模部式4.1第1个正则表达式程序新建一个易语言程序,界面设计如下图所示:按钮被单击事件代码如下:.局部变量正则表达式1,正则表达式正则表达式1.创建(“A.C”,假)编辑框2.内容=至【J文本(正则表达式1.匹配(编辑框1.内容) 如下图所示:在这里,“正则表达式1”是一个正则对象,使用“创建”方法建议了一个“A.C” 正则

9、表达式,然后与编辑框1中的内容进行正则比较,最后得出结论。运行后,大家只要输入三个字符,前为A后为C都会返回真。如下图所示:但如果是小写或多于三个字符,那么返回就会是假。如下图所示:大家也许会问,这样匹配有意义吗?我只能说,有没有意义只在于你怎么用 了,如:可用于程序加密时,不采用判断语句,也不采用循环语句,而是用正则 去匹配是否注册成功,以及可以进行程序名称的检查,程序中一些文字的检查等, 这可能让一些不会正则的破解者很难下手。4.2第2个正则表达式例程通过第一个正则程序,大家会了解正则匹配的重要性,也了解了易语言正则 支持库的基本使用方法,下面这个例程可以让大家了解正则会返回一些更多的内

10、容,大家如何去取回这些信息呢。下面改动上述程序中的一些代码为以下:.局部变量正则表达式1,正则表达式.局部变量搜索结果1,搜索结果,0正则表达式1.创建(“A.C”,假)搜索结果1 =正则表达式1.搜索全部(编辑框1.内容)编辑框2.内容=搜索结果1 1.取匹配文本(编辑框1.内容,)改动后如下所示:变星名类型静态数组备注正则表达式1正则表达式搜索姑果1搜索结果0正则表达式1.创建的搜索结果1二正则表达式1 .搜索全部帽辑框1.内容)编辑椎内容=搜索姑果1 1.取匹配文本 编辑椎1.内容,)在这里,增加了一个搜索结果的对象,用这个对象接收正则表达式匹配的结 果,然后从中提取出大家想要的数据。上

11、述易语言代码的运行结果如下图所示:改动上面编辑框的内容后,结果如下:123adcbe adc按钮这次是较为重要的一环,即我们知道了取回的内容。即由A和C包含的内容。 以及下面会论述到的位置信息。取回的包含的内容意义重大,如:可以取回一对 括号内的内容,这也是为了查找的方便。4.3第3个例程这次的工作任务是取一批文字中的所有字母与数字内容。按钮被单击事件代码如下:.局部变量正则表达式1,正则表达式.局部变量搜索结果1,搜索结果,0.局部变量 数组索引,整数型正则表达式1.创建(a-z0-9” + #换行符+ ”,假)中间的内容,就是要搜索的内容,可以是任意字符,包括换行、空格、 特殊符号.但注意

12、如果有字符”,就表示除了,如*阮表示除了 abc”,现 在,我们给出的表达式意思是匹配含字母、数字、换行符的文本,后面那个假 意思是不区分大小写,你写成真也没有问题。搜索结果1 =正则表达式1.搜索全部(编辑框1.内容)搜索结果是个数组,实际上存放的是字符串搜索后的各种参数,例如位置 等,可以用取匹配文本(,)方法将其取出,注意它的第一个参数必须和搜索 全部()的参数一致编辑框2.内容=”.计次循环首(取数组成员数(搜索结果1),数组索引)编辑框2.加入文本(搜索结果1 数组索引.取匹配文本(编辑框1.内 容,).计次循环尾()图片如下所示:变量名类型静态数蛆备注正则表达式1正则表达式搜索姑果

13、1搜索结果0数组索引整数型正则表达式1.创建 UM出-9” +做行符+ 傲)中间的内容,就是要搜索的内容,可以是任意字符,包括换行、空格、特殊符号.但注意 如果有字符就表示“除了L如表示除了abcm在,我们给出的表达式意思是匹 配含字母、数字、换行符的文本,后面那个“暇“意思是不区分大小写,你写成真也没有问题。搜索结果1 =正则表达式1.搜索全部帽辑框1.内容)搜索结果是个数蛆,实际上存放的是字符串搜索后的各种参数,例如位置等,可以用“取匹配 交本(,)“方法将其取出,注意它的第一个参数必须和“搜索全部()“的参数一致编辑椎.内容=计次循环首 版数蛆成员数 艘索结果1),数组索引):编辑框巳加

14、入文本 髅索结果1 数蛆索引.职匹配交本 端辑框1.内容,) L-计次循环尾o运行后,大家可以在上面的编辑框中输入中文与字母数字的混合,点击按钮 后,就可以从中提取出字母与数字了。运行效果如下图所示:4.4 一个小型的正则工具在这里,大家将学会制作一个小型的正则表达式工具,使用这个工具进行下 面章节更加细致的学习。这个例程也可以在本书的随书光盘中找到。程序界面如下所示安排:按钮被单击事件的代码如下:.局部变量 正则表达式1,正则表达式.局部变量搜索结果1,搜索结果,0.局部变量位置1,整数型正则表达式1.创建(组合框1.内容,假).如果真(正则表达式1.是否为空()=真)连续赋值“”,编辑框A

15、.内容,编辑框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.内容)抓图如下:变量

16、名类型静态数组备注正则表达式1正则表达式搜索结果1搜索结果0位置1整数型壬钮1 一被单击子程序名返回值类型公开备注壬钮1 一被单击正则表达式1.创建 雀合框1.内容,傲)如果真GE则表达式1 .是否为空。二真)-:连续赋值(“”,编辑框人.内容,编辑惟B.内容,编辑椎匚内容,编辑框D.内容,编辑惟Z.内容);返回0箱辑框W.内容=到文本GE则表达式1.匹配 函辑框1.内容)搜索结果1 =正则表达式1.搜索全部 编辑椎1.内容)如果真取数组下标灌索结果L ) = 0)-:连续赋值(“”,编辑框人.内容编辑枢B.内容,编辑椎匚内容,编辑框D.内容编辑枢Z.内容);蛆回0篇辑框A.内容二搜索结果1

17、1.职匹配文本编辑框1 .内径位置1)编辑框B.内容=到文本位置1)编辑框匚内容=到文本位置1 +取文本长度 编辑框人.内容)编辑框D.内容二到文本 敝文本长度 编辑框人.内容JJ通过上述代码后,运行效果如下:上述是测试“匹配”方法中注释的内容:正则表达式.创建(“易语言4.0(模块|支持库)?” )信息框(正则表达式.匹配(“易语言4.0支持库”),0,)在第二章中,大家会发现本书大量用到了这个小程序。请置这个程序的启动窗口总在最前。注意:下标从0开始还是从1开始,因当前编程语言的不同而可能不同。第二章揭开正则表达式的神秘面纱原创文章,转载请保留或注明出处:弓I 言正则表达式(regular

18、 expression)描述了一种字符串匹配的模式,可以用 来:(1 )检查一个串中是否含有符合某个规则的子串,并且可以得到这个子串; (2)根据匹配规则对字符串进行灵活的替换操作。正则表达式学习起来其实是很简单的,不多的几个较为抽象的概念也很容易 理解。之所以很多人感觉正则表达式比较复杂,一方面是因为大多数的文档没有 做到由浅入深地讲解,概念上没有注意先后顺序,给读者的理解带来困难;另一 方面,各种引擎自带的文档一般都要介绍它特有的功能,然而这部分特有的功能 并不是大家首先要理解的。一.正则表达式规则1.1普通字符字母、数字、汉字、下划线、以及后边章节中没有特殊定义的标点符号,都 是“普通字

19、符”。表达式中的普通字符,在匹配一个字符串的时候,匹配与之相 同的一个字符。举例1:表达式“c”,在匹配字符串abcde”时,匹配结果是:成功;匹 配到的内容是:“c” ;匹配到的位置是:开始于2,结束于3。(注:下标从0 开始还是从1开始,因当前编程语言的不同而可能不同)举例2:表达式“bcd”,在匹配字符串abcde”时,匹配结果是:成功;匹配到的内容是:“bcd” ;匹配到的位置是:开始于1,结束于4。1.2简单的转义字符一些不便书写的字符,采用在前面加的方法。这些字符其实我们都已经 熟知了。表达式可匹配r, n代表回车和换行符t制表符代表本身还有其他一些在后边章节中有特殊用处的标点符号

20、,在前面加“”后,就 代表该符号本身。比如:人,$都有特殊意义,如果要想匹配字符串中“人”和“$” 字符,则表达式就需要写成“人”和“$”。表达式可匹配人匹配人符号本身$匹配$符号本身.匹配小数点(.)本身这些转义字符的匹配方法与“普通字符,是类似的。也是匹配与之相同的一 个字符。举例1:表达式“$d”,在匹配字符串“abc$de”时,匹配结果是:成功;匹配到的内容是:“$d” ;匹配到的位置是:开始于3,结束于5。1.3能够与“多种字符匹配的表达式正则表达式中的一些表示方法,可以匹配“多种字符”其中的任意一个字符。 比如,表达式“d”可以匹配任意一个数字。虽然可以匹配其中任意字符,但是只能是

21、一个,不是多个。这就好比玩扑克牌时候,大小王可以代替任意一张牌, 但是只能代替一张牌。表达式可匹配d任意一个数字,09中的任意一个w任意一个字母或数字或下划线,也就是AZ,az,09,_中任意一个s包括空格、制表符、换页符等空白字符的其中任意一个小数点可以匹配除了换行符(n)以外的任意一个字符举例1:表达式“dd”,在匹配“abc123”时,匹配的结果是:成功;匹配到的内容是:“ 12” ;匹配到的位置是:开始于3,结束于5。举例2:表达式“a.d”,在匹配“aaa100”时,匹配的结果是:成功;匹配到的内容是:“aal” ;匹配到的位置是:开始于1,结束于4。1.4自定义能够匹配“多种字符”

22、的表达式使用方括号包含一系列字符,能够匹配其中任意一个字符。用人包 含一系列字符,则能够匹配其中字符之外的任意一个字符。同样的道理,虽然可 以匹配其中任意一个,但是只能是一个,不是多个。表达式可匹配ab5匹配a或b或5或abc匹配a,b,c之外的任意一个字符f-k匹配f”k之间的任意一个字母人A-F0-3匹配AF,03之外的任意一个字符举例1:表达式“bcdbcd”匹配“abc123”时,匹配的结果是:成功;匹配到的内容是:“bc” ;匹配到的位置是:开始于1,结束于3。举例2:表达式“人abc”匹配“abc123”时,匹配的结果是:成功;匹 配到的内容是:“1” ;匹配到的位置是:开始于3,

23、结束于4。1.5修饰匹配次数的特殊符号前面章节中讲到的表达式,无论是只能匹配一种字符的表达式,还是可以匹 配多种字符其中任意一个的表达式,都只能匹配一次。如果使用表达式再加上修 饰匹配次数的特殊符号,那么不用重复书写表达式就可以重复匹配。使用方法是:“次数修饰”放在“被修饰的表达式”后边。比如:“bcdbcd” 可以写成“bcd2”。表达式作用n表达式重复n次,比如:w2”相当于ww”; a5”相当于aaaaam,n表达式至少重复m次,最多重复n次,比如:ba1,3可以匹配ba或baa”或baaa”m,表达式至少重复m次,比如:wd2,”可以匹配a12”,_456”,”M12344”.?匹配表

24、达式0次或者1次,相当于0,1,比如:acd?”可以匹配”a”,ac”,ad”+表达式至少出现1次,相当于1,,比如:a+b”可以匹配ab”,aab”,aaab”.*表达式不出现或出现任意次,相当于0,,比如:A*b”可以匹配”甘,”八八八甘.举例1:表达式“d+.?d*”在匹配It costs $12.5”时,匹配的结果 是:成功;匹配到的内容是:“ 12.5” ;匹配到的位置是:开始于10,结束于 14。举例2:表达式“go2,8gle”在匹配Ads by goooooogle”时,匹配 的结果是:成功;匹配到的内容是:“goooooogle” ;匹配到的位置是:开始 于7,结束于17。想

25、取得某个网址的匹配可以如下:哈哈,越来越有意思了吧,如果在一句话中找到某个网址也是非常简单的了, 如下图所示:1.6其他一些代表抽象意义的特殊符号一些符号在表达式中代表抽象的特殊意义:表达式作用人与字符串开始的地方匹配,不匹配任何字符$与字符串结束的地方匹配,不匹配任何字符b匹配一个单词边界,也就是单词和空格之间的位置,不匹配任何字符进一步的文字说明仍然比较抽象,因此,举例帮助大家理解。举例1:表达式aaa在匹配xxx aaa xxx时,匹配结果是:失败。 因为人要求与字符串开始的地方匹配,因此,只有当aaa位于字符串的开 头的时候,人aaa才能匹配,比如:aaa xxx xxx举例2:表达式

26、aaa$在匹配xxx aaa xxx时,匹配结果是:失败。 因为$要求与字符串结束的地方匹配,因此,只有当aaa位于字符串的结 尾的时候,aaa$”才能匹配,比如:xxx xxx aaa举例3:表达式.b.在匹配”abc”时,匹配结果是:成功;匹配 到的内容是:a;匹配到的位置是:开始于2,结束于4。进一步说明:b与人和$类似,本身不匹配任何字符,但是它要 求它在匹配结果中所处位置的左右两边,其中一边是w范围,另一边是 非 w”的范围。举例4:表达式“bendb”在匹配weekend,endfor,end”时,匹配结 果是:成功;匹配到的内容是:“end” ;匹配到的位置是:开始于15,结束于

27、 18。一些符号可以影响表达式内部的子表达式之间的关系:|左右两边表达式之间”或”关系,匹配左边或者右边(1).在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰()(2).取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到表达式作用举例5:表达式Tom|Jack在匹配字符串Im Tom, he is Jack时 匹配结果是:成功;匹配到的内容是:Tom”;匹配到的位置是:开始于4,结 束于7。匹配下一个时,匹配结果是:成功;匹配到的内容是:Jack;匹配到 的位置时:开始于15,结束于19。举例6:表达式”(gos*)+在匹配Lets go go go!时,匹配结果是: 成功;

28、匹配到内容是:go go go;匹配到的位置是:开始于6,结束于14。举例7:表达式(d+.?d*)”在匹配$10.9,20.5”时,匹配的 结果是:成功;匹配到的内容是:20.5;匹配到的位置是:开始于6,结束 于10。单独获取括号范围匹配到的内容是:20.5”。二.正则表达式中的一些高级规则2.1匹配次数中的贪婪与非贪婪在使用修饰匹配次数的特殊符号时,有几种表示方法可以使同一个表达式能 够匹配不同的次数,比如:m,n, m,”, ?, *, ”+”,具体匹配的次数 随被匹配的字符串而定。这种重复匹配不定次数的表达式在匹配过程中,总是尽 可能多的匹配。比如,针对文本dxxxdxxxd,举例如

29、下:表达式匹配结果(d)(w+)“w+”将匹配第一个“d”之后的所有字符“xxxdxxxd”(d)(w+)(d)“w+”将匹配第一个“d”和最后一个“d”之间的所有字符 “xxxdxxx”。虽然“w+”也能够匹配上最后一个“d”,但是为了使整个表达式匹配成功,w+”可以“让出”它本来能 够匹配的最后一个“d”由此可见,“w+”在匹配的时候,总是尽可能多的匹配符合它规则的字符。 虽然第二个举例中,它没有匹配最后一个“d”,但那也是为了让整个表达式能 够匹配成功。同理,带“*”和“m,n”的表达式都是尽可能地多匹配,带“?” 的表达式在可匹配可不匹配的时候,也是尽可能的“要匹配”。这种匹配原则就

30、叫作“贪婪”模式。非贪婪模式:在修饰匹配次数的特殊符号后再加上一个“?”号,则可以使匹配次数不定的 表达式尽可能少的匹配,使可匹配可不匹配的表达式,尽可能的“不匹配”。这 种匹配原则叫作“非贪婪”模式,也叫作“勉强”模式。如果少匹配就会导致整 个表达式匹配失败的时候,与贪婪模式类似,非贪婪模式会最小限度的再匹配一 些,以使整个表达式匹配成功。举例如下,针对文本“dxxxdxxxd”举例:表达式匹配结果(d)(w+?)“w+?”将尽可能少的匹配第一个“d”之后的字符,结果是:“w+?”只匹配了一个“x”(d)(w+?)(d)为了让整个表达式匹配成功,“w+?”不得不匹配“xxx”才可 以让后边的

31、“d”匹配,从而使整个表达式匹配成功。因此,结 果是:“w+?”匹配xxx”更多的情况,举例如下:举例 1:表达式“(.*)” 与字符串“aa bb”匹配时,匹配的结果是:成功;匹配到的内容是“aa bb” 整个字符串,表达 式中的“”将与字符串中最后一个“”匹配。举例2:相比之下,表达式“(.*?)”匹配举例1中同样的字符 串时,将只得到“ aa ”,再次匹配下一个时,可以得到 第二个“ bb”。2.2反向引用1, 2.表达式在匹配时,表达式引擎会将小括号“()”包含的表达式所匹配到的字 符串记录下来。在获取匹配结果的时候,小括号包含的表达式所匹配到的字符串 可以单独获取。这一点,在前面的举

32、例中,已经多次展示了。在实际应用场合中, 当用某种边界来查找,而所要获取的内容又不包含边界时,必须使用小括号来指 定所要的范围。比如前面的“ (.*?)”。其实,“小括号包含的表达式所匹配到的字符串”不仅是在匹配结束后才可 以使用,在匹配过程中也可以使用。表达式后边的部分,可以引用前面“括号内 的子匹配已经匹配到的字符串”。引用方法是“”加上一个数字。“1”引用 第1对括号内匹配到的字符串,“2”引用第2对括号内匹配到的字符串 以此类推,如果一对括号内包含另一对括号,则外层的括号先排序号。换句话说, 哪一对的左括号“(”在前,那这一对就先排序号。举例如下:举例1:表达式“(T)(.*?)(1)

33、”在匹配“ Hello, World”时,匹配结 果是:成功;匹配到的内容是:Hello”。再次匹配下一个时,可以匹配到 “ World ”。举例 2:表达式(w)14,在匹配aa bbbb abcdefg ccccc 111121111 999999999”时,匹配结果是:成功;匹配到的内容是“ccccc”。再次匹配下 一个时,将得到999999999。这个表达式要求“w”范围的字符至少重复5 次,注意与w5,”之间的区别举例 3:表达式“.*?” 在 匹配“ ”时,匹配结果是成功。如果“”与“”不配对,则会匹配失败;如果改成其他配对,也可 以匹配成功。2.3预搜索,不匹配;反向预搜索,不匹

34、配前面的章节中,本书讲到了几个代表抽象意义的特殊符号:“人”,“$”, “b”。它们都有一个共同点,那就是:它们本身不匹配任何字符,只是对“字 符串的两头”或者“字符之间的缝隙”附加了一个条件。理解到这个概念以后, 本节将继续介绍另外一种对“两头”或者“缝隙”附加条件的,更加灵活的表示 方法。正向预搜索: (?=xxxxx)”,“(?!xxxxx)”格式:(?=xxxxx)”,在被匹配的字符串中,它对所处的“缝隙”或者“两 头”附加的条件是:所在缝隙的右侧,必须能够匹配上xxxxx这部分的表达式。 因为它只是在此作为这个缝隙上附加的条件,所以它并不影响后边的表达式去真 正匹配这个缝隙之后的字符

35、。这就类似“b”,本身不匹配任何字符。“b”只 是将所在缝隙之前、之后的字符取来进行了一下判断,不会影响后边的表达式来 真正的匹配。举例 1:表达式“Windows (?=NT|XP)”在匹配Windows 98, Windows NT, Windows 2000” 时,将只匹配Windows NT” 中的“Windows”,其 他的“Windows字样则不被匹配。举例 2:表达式 “(w)(?=111)(1) + ” 在匹配字符串aaa ffffff 999999999”时,将可以匹配6个“f”的前4个,可以匹配9个“9”的前7 个。这个表达式可以读解成:重复4次以上的字母数字,则匹配其剩下

36、最后2位 之前的部分。当然,这个表达式可以不这样写,在此的目的是作为演示之用。格式:“(?!xxxxx)”,所在缝隙的右侧,必须不能匹配xxxxx这部分表 达式。举例 3:表达式 (?!bstopb).) + ” 在匹配 “fdjka ljfdl stop fjdsla fdj 时,将从头一直匹配到“stop”之前的位置,如果字符串中没有“stop”,则匹 配整个字符串。举例4:表达式“do(?!w)j在匹配字符串“done, do, dog”时,只能匹 配“do”。在本条举例中,“do”后边使用“(?!w)”和使用“b”效果是一 样的。反向预搜索:“(?=xxxxx)”,“(?!xxxxx)

37、”这两种格式的概念和正向预搜索是类似的,反向预搜索要求的条件是:所在 缝隙的“左侧”,两种格式分别要求必须能够匹配和必须不能够匹配指定表达式, 而不是去判断右侧。与“正向预搜索”一样的是:它们都是对所在缝隙的一种附 加条件,本身都不匹配任何字符。举例 5:表达式“(?=d4)d + (?=d4)” 在匹配“ 1234567890123456”时,将匹配除了前4个数字和后4个数字之外的中间 8个数字。由于JScript.RegExp不支持反向预搜索,因此,本条举例不能够进 行演示。很多其他的引擎可以支持反向预搜索,比如:Java 1.4以上的 java.util.regex 包,.NET 中 S

38、ystem.Text.RegularExpressions 命名空间, 以及本站推荐的最简单易用的DEELX正则引擎三. 其他通用规则还有一些在各个正则表达式引擎之间比较通用的规则,在前面的讲解过程中 没有提到。3.1表达式中,可以使用“xXX”和“uXXXX”表示一个字符(“X”表 示一个十六进制数)形式字符范围xXX编号在0 255范围的字符,比如:空格可以使用“x20j表示uXXXX任何字符可以使用“u”再加上其编号的4位十六进制数表示,比如:u4E2D”3.2在表达式s, d, w, b表示特殊意义的同时,对应的大写字母表示相反的意义表达式可匹配S匹配所有非空白字符(s可匹配各个空白字

39、符)D匹配所有的非数字字符W匹配所有的字母、数字、下划线以外的字符B匹配非单词边界,即左右两边都是w范围或者左右两边都不 是w范围时的字符缝隙3.3在表达式中有特殊意义,需要添加“”才能匹配该字符本身的字符汇字符说明人匹配输入字符串的开始位置。要匹配”人”字符本身,请使用”人”$匹配输入字符串的结尾位置。要匹配$字符本身,请使用$()标记一个子表达式的开始和结束位置。要匹配小括号,请使用(和)”用来自定义能够匹配多种字符的表达式。要匹配中括号,请使用和 修饰匹配次数的符号。要匹配大括号,请使用和”匹配除了换行符(n)以外的任意一个字符。要匹配小数点本身,请使用”.”?修饰匹配次数为0次或1次。

40、要匹配?字符本身,请使用?+修饰匹配次数为至少1次。要匹配”+字符本身,请使用”+”*修饰匹配次数为0次或任意次。要匹配*”字符本身,请使用”*”|左右两边表达式之间”或”关系。匹配”|”本身,请使用|3.4括号“()”内的子表达式,如果希望匹配结果不进行记录供以后使用,可以使用“(?:xxxxx)”格式举例1:表达式 “(?:(w)1) + ”匹配“a bbccdd efg”时,结果是 “bbccdd”。括号“(?:)”范围的匹配结果不进行记录,因此(w)”使用“1” 来引用。3.5常用的表达式属性设置简介:Ignorecase,Singleline,Multiline,Global表达式属

41、性说明Ignorecase默认情况下,表达式中的字母是要区分大小与的。配置为Ignorecase可使 匹配时不区分大小写。有的表达式引擎,把大小写”概念延伸至UNICODE 范围的大小与。Singleline默认情况下,小数点.匹配除了换行符(n)以外的字符。配置为Singleline 可使小数点可匹配包括换行符在内的所有字符。Multiline默认情况下,表达式人”和$只匹配字符串的开始 和结尾 位置。如: xxxxxxxxx nxxxxxxxxx配置为Multiline可以使人”匹配 夕卜,还可以匹配换行符之后,下一行 开始前的位置,使$匹配夕卜,还可以匹配换行符之前,一行结束 的位置。G

42、lobal主要在将表达式用来替换时起作用,配置为Global表示替换所有的匹配。其他提示4.1如果想要了解高级的正则引擎还支持那些复杂的正则语法,可参见网上关于DEELX正则引擎的说明文档4.2如果要要求表达式所匹配的内容是整个字符串,而不是从字符串中找一 部分,那么可以在表达式的首尾使用人和$,比如:人d + $要求整个 字符串只有数字。4.3如果要求匹配的内容是一个完整的单词,而不会是单词的一部分,那么 在表达式首尾使用b,比如:使用b(if|while|else|void|int)b来 匹配程序中的关键字4.4表达式不要匹配空字符串。否则会一直得到匹配成功,而结果什么都没 有匹配到。比如:准备写一个匹配123、123.、123.5、.5这几种形 式的表达式时,整数、小数点、小数数字都可以省略,但是不要将表达式写成: d*.?d*,因为如果什么都没有,这个表达式也可以匹配成功。更好的写法 是:d+.?d*|.d+4.5能匹配空字符串的子匹配不要循环无限次。如果括号内的子表达式中的 每一部分都可以匹配0次,而这个括号整体又可以匹配无限次,那么情况可能 比上一条所说的更严重,匹配过程中可能死循环。虽然现在有些正则表达式引擎 已经通过办法避免了这种情况出现死循环了,比如.NET的正则表达式,但是我 们仍然应该尽量避免出现这种情况。如果我们在写表达式时遇到了死循环,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号