易语言正则表达式入门与提高Word文件下载.docx
- 文档编号:20972490
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:67
- 大小:551.11KB
易语言正则表达式入门与提高Word文件下载.docx
《易语言正则表达式入门与提高Word文件下载.docx》由会员分享,可在线阅读,更多相关《易语言正则表达式入门与提高Word文件下载.docx(67页珍藏版)》请在冰豆网上搜索。
引言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、rt,但是不匹配root
(等同于DOS通配符下的?
号。
)
^匹配一行的开始。
例如^When能够匹配字符串"
Wheninthecourseofhumanevents"
的开始,但是不能匹配"
WhatandWheninthe"
。
$匹配行结束符。
例如正则表达式weasel$能够匹配字符串"
He'
saweasel"
的末尾,但是不能匹配字符串"
Theyareabunchofweasels."
在这些字符中,可以使用\.来表示.,\*表示*,不过,这种情况出现得很少,如果不能理解,可以暂时不理它,到用的时候就明白了。
正则表达式还有一个强大的符号:
[],这个[]所括的内容,可以不按顺序进行匹配。
如
[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-Za-z]。
\W
非英文字母和数字
\s
空字符,即[\t\n\r\f]。
\S
非空字符。
\d
数字,即[0-9]。
\D
非数字。
\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,搜索结果,,"
0"
搜索结果1=正则表达式1.搜索全部(编辑框1.内容)
编辑框2.内容=搜索结果1[1].取匹配文本(编辑框1.内容,)
改动后如下所示:
在这里,增加了一个搜索结果的对象,用这个对象接收正则表达式匹配的结果,然后从中提取出大家想要的数据。
上述易语言代码的运行结果如下图所示:
改动上面编辑框的内容后,结果如下:
这次是较为重要的一环,即我们知道了取回的内容。
即由A和C包含的内容。
以及下面会论述到的位置信息。
取回的包含的内容意义重大,如:
可以取回一对括号内的内容,这也是为了查找的方便。
4.3第3个例程
这次的工作任务是取一批文字中的所有字母与数字内容。
.局部变量数组索引,整数型
正则表达式1.创建(“[a-z0-9”+#换行符+“]”,假)
'
[]中间的内容,就是要搜索的内容,可以是任意字符,包括换行、空格、特殊符号.但注意如果有字符"
^"
,就表示"
除了"
,如"
[^abc]"
表示"
除了abc"
现在,我们给出的表达式意思是匹配含字母、数字、换行符的文本,后面那个"
假"
意思是不区分大小写,你写成真也没有问题。
搜索结果是个数组,实际上存放的是字符串搜索后的各种参数,例如位置等,可以用"
取匹配文本(,)"
方法将其取出,注意它的第一个参数必须和"
搜索全部()"
的参数一致
编辑框2.内容=“”
.计次循环首(取数组成员数(搜索结果1),数组索引)
编辑框2.加入文本(搜索结果1[数组索引].取匹配文本(编辑框1.内容,))
.计次循环尾()
图片如下所示:
运行后,大家可以在上面的编辑框中输入中文与字母数字的混合,点击按钮后,就可以从中提取出字母与数字了。
运行效果如下图所示:
4.4一个小型的正则工具
在这里,大家将学会制作一个小型的正则表达式工具,使用这个工具进行下面章节更加细致的学习。
这个例程也可以在本书的随书光盘中找到。
程序界面如下所示安排:
按钮被单击事件的代码如下:
.局部变量位置1,整数型
正则表达式1.创建(组合框1.内容,假)
.如果真(正则表达式1.是否为空()=真)
连续赋值(“”,编辑框A.内容,编辑框B.内容,编辑框C.内容,编辑框D.内容,编辑框2.内容)
返回()
.如果真结束
.如果真(取数组下标(搜索结果1,)=0)
编辑框A.内容=搜索结果1[1].取匹配文本(编辑框1.内容,位置1)
编辑框B.内容=到文本(位置1)
编辑框C.内容=到文本(位置1+取文本长度(编辑框A.内容))
编辑框D.内容=到文本(取文本长度(编辑框A.内容))
抓图如下:
通过上述代码后,运行效果如下:
上述是测试“匹配”方法中注释的内容:
正则表达式.创建(“易语言4\.0(模块|支持库)?
”)
信息框(正则表达式.匹配(“易语言4.0支持库”),0,)
在第二章中,大家会发现本书大量用到了这个小程序。
请置这个程序的启动窗口总在最前。
注意:
下标从0开始还是从1开始,因当前编程语言的不同而可能不同。
第二章揭开正则表达式的神秘面纱
[原创文章,转载请保留或注明出处:
引言
正则表达式(regularexpression)描述了一种字符串匹配的模式,可以用来:
(1)检查一个串中是否含有符合某个规则的子串,并且可以得到这个子串;
(2)根据匹配规则对字符串进行灵活的替换操作。
正则表达式学习起来其实是很简单的,不多的几个较为抽象的概念也很容易理解。
之所以很多人感觉正则表达式比较复杂,一方面是因为大多数的文档没有做到由浅入深地讲解,概念上没有注意先后顺序,给读者的理解带来困难;
另一方面,各种引擎自带的文档一般都要介绍它特有的功能,然而这部分特有的功能并不是大家首先要理解的。
一.正则表达式规则
1.1普通字符
字母、数字、汉字、下划线、以及后边章节中没有特殊定义的标点符号,都是“普通字符”。
表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符。
举例1:
表达式“c”,在匹配字符串“abcde”时,匹配结果是:
成功;
匹配到的内容是:
“c”;
匹配到的位置是:
开始于2,结束于3。
(注:
下标从0开始还是从1开始,因当前编程语言的不同而可能不同)
举例2:
表达式“bcd”,在匹配字符串“abcde”时,匹配结果是:
“bcd”;
开始于1,结束于4。
1.2简单的转义字符
一些不便书写的字符,采用在前面加"
\"
的方法。
这些字符其实我们都已经熟知了。
表达式
可匹配
\r,\n
代表回车和换行符
\t
制表符
\\
代表"
本身
还有其他一些在后边章节中有特殊用处的标点符号,在前面加“\”后,就代表该符号本身。
比如:
^,$都有特殊意义,如果要想匹配字符串中“^”和“$”字符,则表达式就需要写成“\^”和“\$”。
\^
匹配^符号本身
\$
匹配$符号本身
\.
匹配小数点(.)本身
这些转义字符的匹配方法与“普通字符”是类似的。
也是匹配与之相同的一个字符。
表达式“\$d”,在匹配字符串“abc$de”时,匹配结果是:
“$d”;
开始于3,结束于5。
1.3能够与“多种字符”匹配的表达式
正则表达式中的一些表示方法,可以匹配“多种字符”其中的任意一个字符。
比如,表达式“\d”可以匹配任意一个数字。
虽然可以匹配其中任意字符,但是只能是一个,不是多个。
这就好比玩扑克牌时候,大小王可以代替任意一张牌,但是只能代替一张牌。
任意一个数字,0~9中的任意一个
任意一个字母或数字或下划线,也就是A~Z,a~z,0~9,_中任意一个
包括空格、制表符、换页符等空白字符的其中任意一个
小数点可以匹配除了换行符(\n)以外的任意一个字符
表达式“\d\d”,在匹配“abc123”时,匹配的结果是:
“12”;
表达式“a.\d”,在匹配“aaa100”时,匹配的结果是:
“aa1”;
1.4自定义能够匹配“多种字符”的表达式
使用方括号[]包含一系列字符,能够匹配其中任意一个字符。
用[^]包含一系列字符,则能够匹配其中字符之外的任意一个字符。
同样的道理,虽然可以匹配其中任意一个,但是只能是一个,不是多个。
[ab5@]
匹配"
a"
或"
b"
5"
@"
[^abc]
"
c"
之外的任意一个字符
[f-k]
f"
~"
k"
之间的任意一个字母
[^A-F0-3]
A"
F"
3"
表达式“[bcd][bcd]”匹配“abc123”时,匹配的结果是:
“bc”;
开始于1,结束于3。
表达式“[^abc]”匹配“abc123”时,匹配的结果是:
“1”;
开始于3,结束于4。
1.5修饰匹配次数的特殊符号
前面章节中讲到的表达式,无论是只能匹配一种字符的表达式,还是可以匹配多种字符其中任意一个的表达式,都只能匹配一次。
如果使用表达式再加上修饰匹配次数的特殊符号,那么不用重复书写表达式就可以重复匹配。
使用方法是:
“次数修饰”放在“被修饰的表达式”后边。
“[bcd][bcd]”可以写成“[bcd]{2}”。
作用
{n}
表达式重复n次,比如:
"
\w{2}"
相当于"
\w\w"
;
a{5}"
aaaaa"
表达式至少重复m次,最多重复n次,比如:
ba{1,3}"
可以匹配"
ba"
或"
baa"
baaa"
{m,}
表达式至少重复m次,比如:
\w\d{2,}"
a12"
_456"
M12344"
...
匹配表达式0次或者1次,相当于{0,1},比如:
a[cd]?
ac"
ad"
表达式至少出现1次,相当于{1,},比如:
a+b"
ab"
aab"
aaab"
表达式不出现或出现任意次,相当于{0,},比如:
\^*b"
^^^b"
表达式“\d+\.?
\d*”在匹配“Itcosts$12.5”时,匹配的结果是:
“12.5”;
开始于10,结束于14。
表达式“go{2,8}gle”在匹配“Adsbygoooooogle”时,匹配的结果是:
“goooooogle”;
开始于7,结束于17。
想取得某个网址的匹配可以如下:
哈哈,越来越有意思了吧,如果在一句话中找到某个网址也是非常简单的了,如下图所示:
1.6其他一些代表抽象意义的特殊符号
一些符号在表达式中代表抽象的特殊意义:
与字符串开始的地方匹配,不匹配任何字符
与字符串结束的地方匹配,不匹配任何字符
匹配一个单词边界,也就是单词和空格之间的位置,不匹配任何字符
进一步的文字说明仍然比较抽象,因此,举例帮助大家理解。
表达式"
^aaa"
在匹配"
xxxaaaxxx"
时,匹配结果是:
失败。
因为"
要求与字符串开始的地方匹配,因此,只有当"
aaa"
位于字符串的开头的时候,"
才能匹配,比如:
aaaxxxxxx"
aaa$"
$"
要求与字符串结束的地方匹配,因此,只有当"
位于字符串的结尾的时候,"
xxxxxxaaa"
举例3:
.\b."
@@@abc"
@a"
开始于2,结束于4。
进一步说明:
\b"
与"
和"
类似,本身不匹配任何字符,但是它要求它在匹配结果中所处位置的左右两边,其中一边是"
\w"
范围,另一边是非"
的范围。
举例4:
表达式“\bend\b”在匹配“weekend,endfor,end”时,匹配结果是:
“end”;
开始于15,结束于18。
一些符号可以影响表达式内部的子表达式之间的关系:
左右两边表达式之间"
关系,匹配左边或者右边
(1).在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰
(2).取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到
举例5:
Tom|Jack"
在匹配字符串"
I'
mTom,heisJack"
Tom"
开始于4,结束于7。
匹配下一个时,匹配结果是:
Jack"
匹配到的位置时:
开始于15,结束于19。
举例6:
(go\s*)+"
Let'
sgogogo!
匹配到内容是:
gogogo"
开始于6,结束于14。
举例7:
¥(\d+\.?
\d*)"
$10.9,¥20.5"
时,匹配的结果是:
¥20.5"
开始于6,结束于10。
单独获取括号范围匹配到的内容是:
20.5"
二.正则表达式中的一些高级规则
2.1匹配次数中的贪婪与非贪婪
在使用修饰匹配次数的特殊符号时,有几种表示方法可以使同一个表达式能够匹配不同的次数,比如:
{m,n}"
"
{m,}"
*"
+"
,具体匹配的次数随被匹配的字符串而定。
这种重复匹配不定次数的表达式在匹配过程中,总是尽可能多的匹配。
比如,针对文本"
dxxxdxxxd"
,举例如下:
匹配结果
(d)(\w+)
“\w+”将匹配第一个“d”之后的所有字符“xxxdxxxd”
(d)(\w+)(d)
“\w+”将匹配第一个“d”和最后一个“d”之间的所有字符“xxxdxxx”。
虽然“\w+”也能够匹配上最后一个“d”,但是为了使整个表达式匹配成功,“\w+”可以“让出”它本来能够匹配的最后一个“d”
由此可见,“\w+”在匹配的时候,总是尽可能多的匹配符合它规则的字符。
虽然第二个举例中,它没有匹配最后一个“d”,但那也是为了让整个表达式能够匹配成功。
同理,带“*”和“{m,n}”的表达式都是尽可能地多匹配,带“?
”的表达式在可匹配可不匹配的时候,也是尽可能的“要匹配”。
这种匹配原则就叫作“贪婪”模式。
非贪婪模式:
在修饰匹配次数的特殊符号后再加上一个“?
”号,则可以使匹配次数不定的表达式尽可能少的匹配,使可匹配可不匹配的表达式,尽可能的“不匹配”。
这种匹配原则叫作“非贪婪”模式,也叫作“勉强”模式。
如果少匹配就会导致整个表达式匹配失败的时候,与贪婪模式类似,非贪婪模式会最小限度的再匹配一些,以使整个表达式匹配成功。
举例如下,针对文本“dxxxdxxxd”举例:
(d)(\w+?
“\w+?
”将尽可能少的匹配第一个“d”之后的字符,结果是:
”只匹配了一个“x”
)(d)
为了让整个表达式匹配成功,“\w+?
”不得不匹配“xxx”才可以让后边的“d”匹配,从而使整个表达式匹配成功。
因此,结果是:
”匹配“xxx”
更多的情况,举例如下:
表达式“<
td>
(.*)<
/td>
”与字符串“<
<
p>
aa<
/p>
<
bb<
”匹配时,匹配的结果是:
匹配到的内容是“<
”整个字符串,表达式中的“<
”将与字符串中最后一个“<
”匹配。
相比之下,表达式“<
(.*?
)<
”匹配举例1中同样的字符串时,将只得到“<
”,再次匹配下一个时,可以得到第二个“<
”。
2.2反向引用\1,\2...
表达式在匹配时,表达式引擎会将小括号“()”包含的表达式所匹配到的字符串记录下来。
在获取匹配结果的时候,小括号包含的表达式所匹配到的字符串可以单独获取。
这一点,在前面的举例中,已经多次展示了。
在实际应用场合中,当用某种边界来查找,而所要获取的内容又不包含边界时,必须使用小括号来指定所要的范围。
比如前面的“<
t
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 正则 表达式 入门 提高