正则表达式终极教程(游戏达人版看下面地址)_第1页
正则表达式终极教程(游戏达人版看下面地址)_第2页
正则表达式终极教程(游戏达人版看下面地址)_第3页
正则表达式终极教程(游戏达人版看下面地址)_第4页
正则表达式终极教程(游戏达人版看下面地址)_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、中国人正则表达式终极教程学院通俗版 如果这个版本你觉得还很吃力,那请看游戏达人版用正则表达式的目的:搜索一个文本中有没有满足我们指定条件的字符串。例如:搜索上面这句话中有没有“中有没”这个字符串,这个很简单是吧! 正则表达式就是:中有没 这是正则的精确收索,中有没 就是正则条件。 如果正则表达式是:正则|目的|满足 其中“|”= “或者” 的意思 ,即搜索文本中有没有这三个字符串。 但注意:用正则搜索文本的思路是,以正则表达式条件为依据在文本中从头到尾搜 索一遍即完成。正则条件的使用顺序是从左到右反复使用。如果在文本中搜索到符合 条件的字符串,那么接着在文本中搜索时就会跳过这个字符串。 举例说

2、明:正则:山上|上山 文本:鸡山上山鸡多 搜索步骤: 1、山上 的 山 去匹配文本的 鸡,不匹配 2、上山 的 上 去匹配文本的 鸡,不匹配 3、山上 的 山 去匹配文本的 山,匹配 4、山上 的 上 去匹配文本的 上,匹配 <-山上匹配成功。 5、山上 的 山 去匹配文本的 山,匹配 <-注意这里跳过了已经匹配的文本。 6、山上 的 上 去匹配文本的 鸡,不匹配 7、上山 的 上 去匹配文本的 鸡,不匹配 可看出 上山 在文本中没机会匹配了。 。 从第7步中看出虽然文本 鸡山上山鸡多 中 山上 和 上山 都存在, 但由于 山上 的匹配成功,使得后面继续搜索时跳过文本中的 山上,上

3、山 就没有机会匹配成功了。注:绿色粗体字是为了帮助阅读时断句理解。正则之所以难学就是在描述上容易产生歧义。所以读的时候注意断句。如果你能看懂上面的,恭喜你,颁发给你正则学院:小学毕业证书想从文本中取出所有数字串吗? 我们人类的描述方法是:取出文本中的所有数字串。电脑要实现这个要求就得写个函数,专门取数字串,但如果又换一种要求,比如取字母串,那就又得写个取字母串函数,那这种要求多得去了,这函数不就没完没了了吗 ?换一种更具体的特征描述法:以数字开头,后面全是数字的字符串。 找所有数字串的正则是:“0-9+” 找所有字母串的正则是:“A-Za-z+” “条件”表示匹配括号内的任意一个条件。如0-9

4、表示匹配数字0123456789中的一个数字,也可写成0123456789,正则为了简化就定义了范围符号“-”,它前后的字符表示框住的"ASCII"码区域。如下:数字字符 "ASCII"码 0 48 1 49 8 56 9 57大写字母字符 "ASCII"码 A 65 B 66 Y 89 Z 90但注意“条件条件条件”只匹配一个字符。如A-Za-z只表示匹配大小写字母中的中的一个字符。 “+”指定它前面的一个正则单元匹配一次后,继续用这个正则单元重复匹配,直到不满足正则单元条件为止,像0-9、A-Za-z都是正则的一个单元。 0-9+

5、就表示以数字开头的数字串。 事实上正则收索文本是以字节为单位进行匹配收索的,真正匹配的是字符在电脑中的内码,英文就是按"ASCII"码来匹配的,比如“0”的"ASCII"码是48,“A”的"ASCII"码是65。文本中"ASCII"码除了可见的字符外还有些不可见的符号,比如:回车符、制表符等.。要匹配这些符号就可以用内码去匹配,内码用16进制来表示。"ASCII"码表在百度上收索"ASCII" 就出来了。比如正则“x0D”就表示正则回车字符,其中“0D”就是回车符的内码,“x

6、”是正则定义的转义符号,意思是把后两个字符当作16进制的内码处理。如:将以下文本按行搜索出来。Hello,How are you?Hi,I am fine thank you. 注:这里标点符号用的全是英文的半角标点符号。正则:A-ZA-Za-z0-9,?. +x0d. A-Z表示以大写字母开头,这是正则的第一个单元。 A-Za-z0-9,?. 表示只要文本中字符是大小写字母或数字或逗号或问号或句号或空格就匹配,注意右方括号前面有个空格,这是正则的第二单元。 其中“.”表示句号,“”是正则定义的转义符号,因为“.”是正则的关键字,单独使用时表示匹配任意任一一个字符,像 ? * + 等都是正则的

7、关键字,如果文本中有这些符号需要匹配,就在其前面加一个“”。如“?”就是匹配“?”号,这时“?”就不是正则的关键字了。“+” 表示将A-Za-z0-9,?. 这个正则单元重复匹配,直到不满足条件为止。x0d.表示以回车和句号结尾,之所以要加入句号是因为文本尾部可能没有回车符号,但必须是句号结尾。注意:表达式中不能有多余的字符(包括空格等不可视字符),否则就会将其一起当作匹配元素了,特别初学者容易忽视前后不能有空格。如:“A-ZA-Za-z0-9,?. +x0d. ”只能匹配以句号和空格结尾的行了。 “ A-ZA-Za-z0-9,?. +x0d.”只能匹配以空格开头的行了。如果这段你也看懂了,恭

8、喜你,正则学院:中学毕业证书正则汉字串 精确汉字串匹配很简单。 但如果要搜索文本中的所有汉字串该怎么正则呢?聪明的你一定想到了内码,汉字的内码在GB2312简体中文编码表中都是大于x79的(注意是16进制,10进制是127),为的是区别于英文"ASCII"码,并且是用2字节一个汉字符。每个字节的编码范围都是xa1-xfe(10进制就是161-254)。具体可到网上查GB2312简体中文编码表。 那么对于2字节的汉字串: 正则 xa1-xfe+ 可搜索匹配的汉字串。正则 xa1-xfexa1-xfe 可匹配一个汉字,2字节一个汉字符。但现在很多正则程序模块(能够支持正则规则的

9、程序函数集合),已经不再支持这种单字节匹配汉字的做法,而是将大于x79的文本数据单元必须以2字节为单位进行正则匹配,这样做更智能了,避免了半边汉字乱码出现。那么像这种智能化的正则,我们该怎样正则汉字串呢?不同的正则模块就各不相同了,只有看看对应的正则用户说明书。有的 比如:x00-xff 表示按照非单字节字符来匹配汉字,或说成按多字节匹配。方括号内第一个字符为“”在原始的正则规定中,是定义方括号内的内容为排除模式,即将方括号内的条件变为不匹配这些条件。本来 x00-xff 是无意义的,即不匹配任何字符,所以像这样写只能把它整体看为一个符号。(易语言正则不支持汉字匹)另外还可以用 u4e00-u

10、9fa5 来匹配汉字。(易语言正则不支持汉字匹)“u”与“x”意思相同,“x”是表示用 2位16进制数表示内码。“u”是表示用 4位16进制数表示内码。 4e00-9fa5 是 unicode汉字编码表 的汉字编码范围。要了解字符编码就看看下面这篇百度文库里的文章,我觉的写得很好,一看就懂的个样。unicode、utf-8、ansi的故事> 如果这段你也看懂了,恭喜你,正则学院:暑期培训优秀证书正则中的关键字关键字是原始正则定义的,全部是标点符号。如果要用其匹配文本必须在其前加“”。(正则因此变得神秘了,看起来就象外星文)1-“” 转义号,如需匹配它就需在其前面再加个“”,即“”表示一个

11、斜杠。以下同理。2-“|” 其前后正则单元为 "或" 关系。在键盘上与“”是同一个按键。3-“.” 表示匹配任意任一一个字符,相当与x00-xff。4-“+”是至少匹配一个它前面的一个正则单元(1-无穷),直到条件不匹配为止。5-“*”是匹配任意多个它前面的一个正则单元(0-无穷),直到条件不匹配为止。但千万注意:用易语言官方支持库中的正则类来正则匹配时,*号前面的单元前必须要加一个限位单元,如:“0-90-9*”,但不能单独只使用“0-9*”否则程序很有可能挂掉,这可能是因为正则会无限次的匹配0次这个逻辑,始终没有字符被跳过,即在0次匹配逻辑上死循环,经试验如果文本第一个

12、字符是数字,用“0-9*”去正则必死。用其他第三方的正则引擎就没有这个问题,可以不加限位也可。 以下是易语言官方解释: 能匹配空字符串的子匹配不要循环无限次。如果括号内的子表达式中的每一部分都可以匹配 0 次,而这个括号整体又可以匹配无限次,匹配过程中可能死循环。虽然现在有些正则表达式引擎已经通过办法避免了这种情况出现死循环了,比如 .NET 的正则表达式,但是我们仍然应该尽量避免出现这种情况。如果我们在写表达式时遇到了死循环,也可以从这一点入手,查找一下是否是本条所说的原因。6-“?”是只匹配它前面的正则单元 0 次或 1 次。注意:这个也有0次匹配陷阱。7-“n,m”匹配次数范围定义括号。

13、 这个也可能有0次匹配陷阱。8-“”匹配文本的开始位置。 后面再说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个

14、不能匹配 a1234567c 只匹配出“123456”,7不能匹配a123a12345a123456c 匹配出3个字符串还可以精确匹配次数:0-93 表示只匹配有3个字符的数字字符串。如果这段你也看懂了,恭喜你,正则学院:高中毕业证书正则表达式的简化和效率用正则搜索文本的思路是,以正则表达式条件为依据在文本中从头到尾搜 索一遍即完成。正则条件的使用顺序是从左到右反复使用。如果在文本中搜索到符合 条件的字符串,那么接着在文本中搜索时就会跳过这个字符串。 从上文中可以看出正则条件是被反复使用的,也就是说正则表达式在收索过程中要使用很多次,那么正则表达式越短或者说字符越少,效率就会成倍提高(这个我不

15、肯定,也有可能只是为了输入方便。),所以正则为此定义了一些简化符号。都是小写字母,如下: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

16、-8的效率,也就是在匹配时 3-8 比 0-9 用时短。当然能考虑的时候就尽量考虑,不好考虑的话还是放宽范围为妙,免得出错。正则的排除模式表达式前面的正则都是用“包含”的概念来表达正则,但有时我们希望用“排除”的概念来表达。比如:匹配不是数字的字符,即排除数字,正则为,0-9 匹配不是字母的字符,即排除字母,正则为,A-Za-z看出来了吧!就是在左方括号后加个“”,与键盘上的6同一个键。大多数时候我们叫他乘方符号。另外还有些精简的表示法,都是大写字母。 如下: D = 0-9 排除数字,就是不匹配数字 或者说 除数字之外的字符匹配。 W = A-Za-z0-9 排除大小写字母和数字。 S 排除

17、不可见字符。正则的内码表达式xFF 红字是2位十六进制内码,只能两位,少于2位时,前面必须加0补齐,如x0A。 uFFFF 红字是4位十六进制内码,只能四位,少于4位时,同上。如果这三段你也看懂了,恭喜你,正则学院:大学毕业证书 正则的特殊匹配:边界匹配b 用它前面的正则单元去匹配,并且匹配的字符串在文本中后面是空格或者文本尾。 如: 文本“ABC DEC” 正则式“Cb” 结果是2个C 字符串,第一个C后是空格,第二C后面 是文本尾部 “C DECb” 结果就是“C DEC” ,“C DEC”是一个正则单元。 可以用其搜索单词尾部。B 用它前面的正则单元去匹配,并且匹配的字符串在文本中后面不

18、是空格或者文本尾。 如: 文本“ABC DEC” 正则式 “A-Z+B” 结果是AB DE 2个字符串 “C DEB” 结果就是“C DE”“”用它后面的正则单元去匹配,并且匹配的字符串在文本中是文本头或行首。“$”用它前面的正则单元去匹配,并且匹配的字符串在文本中是文本尾或行尾。 如: 文本:abcdefg abcdef abcde 正则式:“w+f$” 结果是“abcdef” 即第二行, 注:开启多行匹配 正则式:“abc” 结果是“abc” 即第一行abc 注:开启多行匹配 结果是3个“abc” 注:开启多行匹配和全局匹配 多行和全局是“”,“$”这两个正则关键字特有的选项开关,必须在正

19、则函数命令中指定。为什么有这两个选项呢? 我大概描述一下我的理解: 多行开关开启,表示可以多行匹配,但两个符号的作用都不能加持重复匹配符号,所以整个正则只能匹配一次。 全局开关开启,表示可以重复匹配每一行,但两个符号又只能匹配文本头和尾,有矛盾在。 所以必须两个都打开,才行。两个选项都关闭: 只能匹配文本头。 $ 只能匹配文件尾。 $ 正则必须完全与整个文本匹配,才能算匹配。 只打开多行选项: 只能匹配文本头。 $ 只能匹配文本第一行尾。 $ 正则必须完全与文本中任一一行匹配,才能算匹配,最 多只能匹配一行。只打开全局选项: 只能匹配文本头。 $ 只能匹配文本尾。 $ 正则必须完全包含文本第一

20、行所有字符,并且文本只能有一行, 行尾不能有回车符,才能算匹配。两个选项都打开: 匹配所有的行首。 $ 匹配所有的行尾。$ 匹配所有的行,必须完全包含文本行所有字符,才能算匹配。以上的描述较难理解,只有多试几次,对照上述结果仔细参详。阿弥托福 我尽力了! 如果这段你也看懂了,恭喜你,正则学院:硕士毕业证书正则的“贪心模式”和“懒惰模式” 正则中“* + ? m,n”这类表示重复的符号,在匹配中是分两种模式的,“贪心模式”就是我们一般正常理解的模式,只要匹配正则单元就尽可能多的去匹配。“懒惰模式”与它相反就是尽可能少的去匹配,最少至0匹配。正则表示方法为:在“* + ? m,n”这些符号后再加一

21、个“?”如: 文本:0123456789 正则:0-93,6? 结果是“012”“345”“678” 按照最少3个字符取匹配。不加:0-93,6 结果是 “012345” “6789”按照最多6个字符取匹配。用途我是没想到,这有啥用?可能是我还不知道到它的用途。反正正则是定义了它。正则存储数据的秘密 前面说的都是正则匹配的字符串的方法,那么正则匹配出来的字符串存方在那里呢?虽然我们用正则的时候不必知道它们的存放位置,但如果能知道的话,用起来更放心些。事实上,正则并没有把匹配的字符串从文本中复制出来,而是把匹配的起始位置及长度记录了下来,当要提取正则出来的字符串时,再根据这些记录到文本中去提取字

22、符串。这样做的好处我想对于聪明的你,我就不必多说了吧!正则的子串当文本中需要正则的字符串不只一种,而是几种,并且它们是按大类顺序出现在文本中时如:上面绿色部分如果我们想从中分别提取网址、日期,就需要两个正则变量来正则,或者一次全部提取,然后另行处理来分开,麻烦吗?我认为麻烦。正则也考虑到了这种需求,所有它定义了子串这个功能。例如:如文本:“大家说 芙蓉=2姐 凤姐=B妹 对吗?” 正则:(u4e00-u9fa52)=(2Bu4e00-u9fa5)u4e00-u9fa5还记得吧!是匹配汉字,u4e00-u9fa52就是匹配2个汉字u4e00-u9fa52=2Bu4e00-u9fa5表示:2个汉字

23、开头,接着是“=”,接着是“2”或者“B”,结尾是一个汉字的字符串。圆括号括起来就表示要提取其中的子串。那么正则出来就会有6个字符串。“芙蓉=2姐” “芙蓉” “2姐”“凤姐=B妹” “凤姐” “B妹”“芙蓉”和“2姐”就是“芙蓉=2姐”的子串。“凤姐”和“B妹”就是“凤姐=B妹”的子串。如果这三段你也看懂了,恭喜你,正则学院:博士毕业证书正则子串匹配结果的引用上面的子串如果你理解了,那么这段你看懂的几率只有60%左右,如果你看懂了,恭喜我,因为我把它表达清楚了。你呢就进入叫兽初级阶段。我们来看看下面的正则: 文本 AbA 正则 (A-Z)(a-z) 结果是3个字符串“Ab” 以及它的子串 “

24、A”“b”如果正则 (A-Z)(a-z)1 后面加了个正则子串匹配结果的引用 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不匹配,所有整个正则结果为空。正则的后假匹配 这段如果你能看懂,你就是中级叫兽。正则匹配有时我们为了校验匹配的正确性,希望多匹配一些附近的字符,但结果中并不想要这些校验用字符,在正则中我把这些校验用字符的匹配叫假匹配。文本 AAAabc000cde* 要求只匹配数字前面的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论