《正则表达式终极教程游戏达人版看下面地址.doc》由会员分享,可在线阅读,更多相关《正则表达式终极教程游戏达人版看下面地址.doc(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、正则表达式终极教程(游戏达人版看下面地址)中国人正则表达式终极教程学院通俗版 如果这个版本你觉得还很吃力,那请看游戏达人版用正则表达式的目的:搜索一个文本中有没有满足我们指定条件的字符串。例如:搜索上面这句话中有没有“中有没”这个字符串,这个很简单是吧! 正则表达式就是:中有没 这是正则的精确收索,中有没 就是正则条件。 如果正则表达式是:正则|目的|满足 其中“|”= “或者” 的意思 ,即搜索文本中有没有这三个字符串。 但注意:用正则搜索文本的思路是,以正则表达式条件为依据在文本中从头到尾搜 索一遍即完成。正则条件的使用顺序是从左到右反复使用。如果在文本中搜索到符合 条件的字符串,那么接着
2、在文本中搜索时就会跳过这个字符串。 举例说明:正则:山上|上山 文本:鸡山上山鸡多 搜索步骤: 1、山上 的 山 去匹配文本的 鸡,不匹配 2、上山 的 上 去匹配文本的 鸡,不匹配 3、山上 的 山 去匹配文本的 山,匹配 4、山上 的 上 去匹配文本的 上,匹配 -山上匹配成功。 5、山上 的 山 去匹配文本的 山,匹配 如果这段你也看懂了,恭喜你,正则学院:暑期培训优秀证书正则中的关键字关键字是原始正则定义的,全部是标点符号。如果要用其匹配文本必须在其前加“”。(正则因此变得神秘了,看起来就象外星文)1-“” 转义号,如需匹配它就需在其前面再加个“”,即“”表示一个斜杠。以下同理。2-“
3、|” 其前后正则单元为 或 关系。在键盘上与“”是同一个按键。3-“.” 表示匹配任意任一一个字符,相当与x00-xff。4-“+”是至少匹配一个它前面的一个正则单元(1-无穷),直到条件不匹配为止。5-“*”是匹配任意多个它前面的一个正则单元(0-无穷),直到条件不匹配为止。但千万注意:用易语言官方支持库中的正则类来正则匹配时,*号前面的单元前必须要加一个限位单元,如:“0-90-9*”,但不能单独只使用“0-9*”否则程序很有可能挂掉,这可能是因为正则会无限次的匹配0次这个逻辑,始终没有字符被跳过,即在0次匹配逻辑上死循环,经试验如果文本第一个字符是数字,用“0-9*”去正则必死。用其他第
4、三方的正则引擎就没有这个问题,可以不加限位也可。 以下是易语言官方解释: 能匹配空字符串的子匹配不要循环无限次。如果括号内的子表达式中的每一部分都可以匹配 0 次,而这个括号整体又可以匹配无限次,匹配过程中可能死循环。虽然现在有些正则表达式引擎已经通过办法避免了这种情况出现死循环了,比如 .NET 的正则表达式,但是我们仍然应该尽量避免出现这种情况。如果我们在写表达式时遇到了死循环,也可以从这一点入手,查找一下是否是本条所说的原因。6-“?”是只匹配它前面的正则单元 0 次或 1 次。注意:这个也有0次匹配陷阱。7-“n,m”匹配次数范围定义括号。 这个也可能有0次匹配陷阱。8-“”匹配文本的
5、开始位置。 后面再说9-“$”匹配文本结尾位置。 后面再说A-“()”子表达式括号。 后面再说B-“”匹配括号内的任意一个条件。相信前面6个和最后一个都看得懂。第7个“n,m”匹配次数定义括号。其实4、5、6都是7的特例:0-9* 相当于 0-90, 后个数字不写表示无穷0-9+ 相当于 0-91, 0-9? 相当于 0-90,1 看出来了吗?“n,m”就是参照前面的一个正则单元重复匹配时的重复次数范围。逗号前是至少匹配多少个,逗号后是最多匹配多少个。如: 0-93,6 表示匹配的数字串至少要3个数字,但最长不超过6个。如:a12c 数字串少于3个不能匹配 a1234567c 只匹配出“123
6、456”,7不能匹配a123a12345a123456c 匹配出3个字符串还可以精确匹配次数:0-93 表示只匹配有3个字符的数字字符串。如果这段你也看懂了,恭喜你,正则学院:高中毕业证书正则表达式的简化和效率用正则搜索文本的思路是,以正则表达式条件为依据在文本中从头到尾搜 索一遍即完成。正则条件的使用顺序是从左到右反复使用。如果在文本中搜索到符合 条件的字符串,那么接着在文本中搜索时就会跳过这个字符串。 从上文中可以看出正则条件是被反复使用的,也就是说正则表达式在收索过程中要使用很多次,那么正则表达式越短或者说字符越少,效率就会成倍提高(这个我不肯定,也有可能只是为了输入方便。),所以正则为
7、此定义了一些简化符号。都是小写字母,如下:n = 换行符 = x0Ar = 回车符 = x0Dt = 制表符 = x09v = 垂直制表符 = x0Be = ESC 符 = x1Bf= 分页符d = 0-9w = A-Za-z0-9_ 匹配字母、数字、下划线。s 匹配任何不可见,包括空格、制表符、分页符等。cx 匹配由x指明的控制字符。例如, cM 匹配一个 Ctrl-M 或 回车符,Ctrl就是键盘 左下脚的那个键。x 的值必须为 A-Z 或 a-z 之一。缩短正则式是提高收索效率的一方面,另一方面还要考虑条件表达的范围。比如 0-9的效率小于3-8的效率,也就是在匹配时 3-8 比 0-9
8、 用时短。当然能考虑的时候就尽量考虑,不好考虑的话还是放宽范围为妙,免得出错。正则的排除模式表达式前面的正则都是用“包含”的概念来表达正则,但有时我们希望用“排除”的概念来表达。比如:匹配不是数字的字符,即排除数字,正则为,0-9 匹配不是字母的字符,即排除字母,正则为,A-Za-z看出来了吧!就是在左方括号后加个“”,与键盘上的6同一个键。大多数时候我们叫他乘方符号。另外还有些精简的表示法,都是大写字母。 如下: D = 0-9 排除数字,就是不匹配数字 或者说 除数字之外的字符匹配。 W = A-Za-z0-9 排除大小写字母和数字。 S 排除不可见字符。正则的内码表达式xFF 红字是2位
9、十六进制内码,只能两位,少于2位时,前面必须加0补齐,如x0A。 uFFFF 红字是4位十六进制内码,只能四位,少于4位时,同上。如果这三段你也看懂了,恭喜你,正则学院:大学毕业证书 正则的特殊匹配:边界匹配b 用它前面的正则单元去匹配,并且匹配的字符串在文本中后面是空格或者文本尾。 如: 文本“ABC DEC” 正则式“Cb” 结果是2个C 字符串,第一个C后是空格,第二C后面 是文本尾部 “C DECb” 结果就是“C DEC” ,“C DEC”是一个正则单元。 可以用其搜索单词尾部。B 用它前面的正则单元去匹配,并且匹配的字符串在文本中后面不是空格或者文本尾。 如: 文本“ABC DEC
10、” 正则式 “A-Z+B” 结果是AB DE 2个字符串 “C DEB” 结果就是“C DE”“”用它后面的正则单元去匹配,并且匹配的字符串在文本中是文本头或行首。“$”用它前面的正则单元去匹配,并且匹配的字符串在文本中是文本尾或行尾。 如: 文本:abcdefg abcdef abcde 正则式:“w+f$” 结果是“abcdef” 即第二行, 注:开启多行匹配 正则式:“abc” 结果是“abc” 即第一行abc 注:开启多行匹配 结果是3个“abc” 注:开启多行匹配和全局匹配 多行和全局是“”,“$”这两个正则关键字特有的选项开关,必须在正则函数命令中指定。为什么有这两个选项呢? 我大
11、概描述一下我的理解: 多行开关开启,表示可以多行匹配,但两个符号的作用都不能加持重复匹配符号,所以整个正则只能匹配一次。 全局开关开启,表示可以重复匹配每一行,但两个符号又只能匹配文本头和尾,有矛盾在。 所以必须两个都打开,才行。两个选项都关闭: 只能匹配文本头。 $ 只能匹配文件尾。 $ 正则必须完全与整个文本匹配,才能算匹配。 只打开多行选项: 只能匹配文本头。 $ 只能匹配文本第一行尾。 $ 正则必须完全与文本中任一一行匹配,才能算匹配,最 多只能匹配一行。只打开全局选项: 只能匹配文本头。 $ 只能匹配文本尾。 $ 正则必须完全包含文本第一行所有字符,并且文本只能有一行, 行尾不能有回
12、车符,才能算匹配。两个选项都打开: 匹配所有的行首。 $ 匹配所有的行尾。$ 匹配所有的行,必须完全包含文本行所有字符,才能算匹配。以上的描述较难理解,只有多试几次,对照上述结果仔细参详。阿弥托福 我尽力了! 如果这段你也看懂了,恭喜你,正则学院:硕士毕业证书正则的“贪心模式”和“懒惰模式” 正则中“* + ? m,n”这类表示重复的符号,在匹配中是分两种模式的,“贪心模式”就是我们一般正常理解的模式,只要匹配正则单元就尽可能多的去匹配。“懒惰模式”与它相反就是尽可能少的去匹配,最少至0匹配。正则表示方法为:在“* + ? m,n”这些符号后再加一个“?”如: 文本:0123456789 正则
13、:0-93,6? 结果是“012”“345”“678” 按照最少3个字符取匹配。不加:0-93,6 结果是 “012345” “6789”按照最多6个字符取匹配。用途我是没想到,这有啥用?可能是我还不知道到它的用途。反正正则是定义了它。正则存储数据的秘密 前面说的都是正则匹配的字符串的方法,那么正则匹配出来的字符串存方在那里呢?虽然我们用正则的时候不必知道它们的存放位置,但如果能知道的话,用起来更放心些。事实上,正则并没有把匹配的字符串从文本中复制出来,而是把匹配的起始位置及长度记录了下来,当要提取正则出来的字符串时,再根据这些记录到文本中去提取字符串。这样做的好处我想对于聪明的你,我就不必多
14、说了吧!正则的子串当文本中需要正则的字符串不只一种,而是几种,并且它们是按大类顺序出现在文本中时如:上面绿色部分如果我们想从中分别提取网址、日期,就需要两个正则变量来正则,或者一次全部提取,然后另行处理来分开,麻烦吗?我认为麻烦。正则也考虑到了这种需求,所有它定义了子串这个功能。例如:如文本:“大家说 芙蓉=2姐 凤姐=B妹 对吗?” 正则:(u4e00-u9fa52)=(2Bu4e00-u9fa5)u4e00-u9fa5还记得吧!是匹配汉字,u4e00-u9fa52就是匹配2个汉字u4e00-u9fa52=2Bu4e00-u9fa5表示:2个汉字开头,接着是“=”,接着是“2”或者“B”,结
15、尾是一个汉字的字符串。圆括号括起来就表示要提取其中的子串。那么正则出来就会有6个字符串。“芙蓉=2姐” “芙蓉” “2姐”“凤姐=B妹” “凤姐” “B妹”“芙蓉”和“2姐”就是“芙蓉=2姐”的子串。“凤姐”和“B妹”就是“凤姐=B妹”的子串。如果这三段你也看懂了,恭喜你,正则学院:博士毕业证书正则子串匹配结果的引用上面的子串如果你理解了,那么这段你看懂的几率只有60%左右,如果你看懂了,恭喜我,因为我把它表达清楚了。你呢就进入叫兽初级阶段。我们来看看下面的正则: 文本 AbA 正则 (A-Z)(a-z) 结果是3个字符串“Ab” 以及它的子串 “A”“b”如果正则 (A-Z)(a-z)1 后
16、面加了个正则子串匹配结果的引用 1,表示把第一个括号已经匹配的字符串引用一次来匹配 ,则实际效果是(A-Z)(a-z)A。结果就变为: “AbA”以及它的子串 “A”“b”也可加括号(A-Z)(a-z)(1) 则实际效果是(A-Z)(a-z)(A)。结果就变为: “AbA”以及它的子串 “A”“b”“A” 同理如果 1 变成2 ,表示把第二个括号已经匹配的字符串引用一次 。 注意:只能引用前面的不能引用后面的。千万注意:引用的是前面匹配的结果来匹配,不是引用前面的正则单元条件来匹配。 比如: AbC (A-Z)(a-z)1的正则结果为空,因为第一个括号匹配的结果是A,与C不匹配,所有整个正则结
17、果为空。正则的后假匹配 这段如果你能看懂,你就是中级叫兽。正则匹配有时我们为了校验匹配的正确性,希望多匹配一些附近的字符,但结果中并不想要这些校验用字符,在正则中我把这些校验用字符的匹配叫假匹配。文本 AAAabc000cde* 要求只匹配数字前面的小写字符串:正则a-z+ 会匹配出 abc cde两个串正确的正则是:a-z+(?=d) 匹配结果是“abc”,圆括号内开头两个字符是?=,则表示括号前的正则单元必须匹配,并且括号内的正则也必须匹配,但最终结果要去掉括号内正则单元的匹配结果。即后面的d为假匹配。要求只匹配必须是3个小写字母的字符串,并且后面不是数字。 正则是 a-z3(?!d) 匹
18、配结果是“cde”,圆括号内头两个字符是?! 则表示括号前的正则单元必须匹配,并且括号内的正则必须不匹配,最终结果就是圆括号前面正则单元的匹配。即后面d不匹配为假匹配。正则的前假匹配 如果你已经自认是中级叫兽了,那么前假匹配也就好理解了。文本 AAAabc000cde* 要求只匹配数字后面的小写字符串: 正则就是 (?=d)a-z+ 匹配结果是“cde”,圆括号内开头三个字符是?=,则表示括号后的正则单元必须匹配,并且括号内的正则也必须匹配,但最终结果要去掉括号内正则单元的匹配结果。即前面的d为假匹配。要求只匹配必须是3个小写字母的字符串,并且前面不是数字。正则就是 (?!d)a-z3 匹配结果是“abc”, 圆括号内开头三个字符是?! 则表示括号后的正则单元必须匹配,并且括号内的正则必须不匹配,最终结果就是括号后面正则单元的匹配。即前面d不匹配为假匹配。至此如果以上你都懂了,那就只好郑重授予你正则学院:终极叫兽称号了。不同的正则引擎还有些细节上的不同规定,这些就只有在使用时看说明书了。本教程是我原创教程,是我学正则的笔记,把它整理出来,希望能帮助到学习正则感 到迷茫的同学们。如果因此让你学懂了正则,我将深感荣幸。如果你愿意鼓励我,就请转1元钱到我支付宝帐户中。支付宝帐号:QQEmail: QQ名:涅槃成佛 最后祝我们大家编程愉快。