揭开正则表达式的神秘面纱38299

上传人:kms****20 文档编号:40363972 上传时间:2018-05-26 格式:DOC 页数:10 大小:132KB
返回 下载 相关 举报
揭开正则表达式的神秘面纱38299_第1页
第1页 / 共10页
揭开正则表达式的神秘面纱38299_第2页
第2页 / 共10页
揭开正则表达式的神秘面纱38299_第3页
第3页 / 共10页
揭开正则表达式的神秘面纱38299_第4页
第4页 / 共10页
揭开正则表达式的神秘面纱38299_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《揭开正则表达式的神秘面纱38299》由会员分享,可在线阅读,更多相关《揭开正则表达式的神秘面纱38299(10页珍藏版)》请在金锄头文库上搜索。

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

2、进入到测试页面进行测试。闲话少说, 开始。1.1. 正则表达式规则正则表达式规则1.11.1 普通字符普通字符字母、数字、汉字、下划线、以及后边章节中没有特殊定义的标点符号, 都是“普通字符“。表达式中的普通字符,在匹配一个字符串的时候,匹配与之 相同的一个字符。举例 1:表达式 “c“,在匹配字符串 “abcde“ 时,匹配结果是:成功;匹 配到的内容是:“c“;匹配到的位置是:开始于 2,结束于 3。(注:下标从 0 开始还是从 1 开始,因当前编程语言的不同而可能不同)举例 2:表达式 “bcd“,在匹配字符串 “abcde“ 时,匹配结果是:成功; 匹配到的内容是:“bcd“;匹配到的

3、位置是:开始于 1,结束于 4。1.21.2 简单的转义字符简单的转义字符一些不便书写的字符,采用在前面加 “ 的方法。这些字符其实我们都已 经熟知了。表达式可匹配r, n代表回车和换行符t制表符代表 “ 本身还有其他一些在后边章节中有特殊用处的标点符号,在前面加 “ 后,就 代表该符号本身。比如:, $ 都有特殊意义,如果要想匹配字符串中 “ 和 “$“ 字符,则表达式就需要写成 “ 和 “$“。表达式可匹配匹配 符号本身$匹配 $ 符号本身.匹配小数点(.)本身这些转义字符的匹配方法与 “普通字符“ 是类似的。也是匹配与之相同的 一个字符。举例 1:表达式 “$d“,在匹配字符串 “abc

4、$de“ 时,匹配结果是:成功; 匹配到的内容是:“$d“;匹配到的位置是:开始于 3,结束于 5。1.31.3 能够与能够与 多种字符多种字符 匹配的表达式匹配的表达式正则表达式中的一些表示方法,可以匹配 多种字符 其中的任意一个字 符。比如,表达式 “d“ 可以匹配任意一个数字。虽然可以匹配其中任意字符, 但是只能是一个,不是多个。这就好比玩扑克牌时候,大小王可以代替任意一 张牌,但是只能代替一张牌。表达式可匹配d任意一个数字,09 中的任意一个w任意一个字母或数字或下划线,也就是 AZ,az,09,_ 中任意一个s包括空格、制表符、换页符等空白字符的其中任意一个.小数点可以匹配除了换行符

5、(n)以外的任意一个字符举例 1:表达式 “dd“,在匹配 “abc123“ 时,匹配的结果是:成功;匹 配到的内容是:“12“;匹配到的位置是:开始于 3,结束于 5。举例 2:表达式 “a.d“,在匹配 “aaa100“ 时,匹配的结果是:成功;匹 配到的内容是:“aa1“;匹配到的位置是:开始于 1,结束于 4。1.41.4 自定义能够匹配自定义能够匹配 多种字符多种字符 的表达式的表达式使用方括号 包含一系列字符,能够匹配其中任意一个字符。用 包含一系列字符,则能够匹配其中字符之外的任意一个字符。同样的道理,虽 然可以匹配其中任意一个,但是只能是一个,不是多个。表达式可匹配ab5匹配

6、“a“ 或 “b“ 或 “5“ 或 “abc匹配 “a“,“b“,“c“ 之外的任意一个字符f-k匹配 “f“k“ 之间的任意一个字母A-F0-3匹配 “A“F“,“0“3“ 之外的任意一个字符举例 1:表达式 “bcdbcd“ 匹配 “abc123“ 时,匹配的结果是:成功; 匹配到的内容是:“bc“;匹配到的位置是:开始于 1,结束于 3。举例 2:表达式 “abc“ 匹配 “abc123“ 时,匹配的结果是:成功;匹 配到的内容是:“1“;匹配到的位置是:开始于 3,结束于 4。1.51.5 修饰匹配次数的特殊符号修饰匹配次数的特殊符号前面章节中讲到的表达式,无论是只能匹配一种字符的表达

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

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

9、始于 7,结束于 17。1.61.6 其他一些代表抽象意义的特殊符号其他一些代表抽象意义的特殊符号一些符号在表达式中代表抽象的特殊意义:表达式作用与字符串开始的地方匹配,不匹配任何字符$与字符串结束的地方匹配,不匹配任何字符b匹配一个单词边界,也就是单词和空格之间的位置,不匹配任何字符进一步的文字说明仍然比较抽象,因此,举例帮助大家理解。举例 1:表达式 “aaa“ 在匹配 “xxx aaa xxx“ 时,匹配结果是:失败。 因为 “ 要求与字符串开始的地方匹配,因此,只有当 “aaa“ 位于字符串的 开头的时候,“aaa“ 才能匹配,比如:“aaa xxx xxx“。举例 2:表达式 “aa

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

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

12、,结束于 19。举例 6:表达式 “(gos*)+“ 在匹配 “Lets go go go!“ 时,匹配结果是: 成功;匹配到内容是:“go go go“;匹配到的位置是:开始于 6,结束于 14。举例 7:表达式 “¥(d+.?d*)“ 在匹配 “10.9,¥20.5“ 时,匹配的 结果是:成功;匹配到的内容是:“¥20.5“;匹配到的位置是:开始于 6,结 束于 10。单独获取括号范围匹配到的内容是:“20.5“。2.2. 正则表达式中的一些高级规则正则表达式中的一些高级规则2.12.1 匹配次数中的贪婪与非贪婪匹配次数中的贪婪与非贪婪在使用修饰匹配次数的特殊符号时,有几种表示方法可以使同

13、一个表达式 能够匹配不同的次数,比如:“m,n“, “m,“, “?“, “*“, “+“,具体匹配的 次数随被匹配的字符串而定。这种重复匹配不定次数的表达式在匹配过程中, 总是尽可能多的匹配。比如,针对文本 “dxxxdxxxd“,举例如下:表达式匹配结果(d)(w+)“w+“ 将匹配第一个 “d“ 之后的所有字符 “xxxdxxxd“(d)(w+)(d)“w+“ 将匹配第一个 “d“ 和最后一个 “d“ 之间的所有字符 “xxxdxxx“。虽然 “w+“ 也能够匹配上最后一个 “d“,但是为了 使整个表达式匹配成功,“w+“ 可以 “让出“ 它本来能够匹配的 最后一个 “d“由此可见,“w

14、+“ 在匹配的时候,总是尽可能多的匹配符合它规则的字符。 虽然第二个举例中,它没有匹配最后一个 “d“,但那也是为了让整个表达式能 够匹配成功。同理,带 “*“ 和 “m,n“ 的表达式都是尽可能地多匹配,带 “?“ 的表达式在可匹配可不匹配的时候,也是尽可能的 “要匹配“。这 种匹配 原则就叫作 “贪婪“ 模式 。非贪婪模式:在修饰匹配次数的特殊符号后再加上一个 “?“ 号,则可以使匹配次数不定 的表达式尽可能少的匹配,使可匹配可不匹配的表达式,尽可能的 “不匹配“。 这种匹配原则叫作 “非贪婪“ 模式,也叫作 “勉强“ 模式。如果少匹配就会导 致整个表达式匹配失败的时候,与贪婪模式类似,非

15、贪婪模式会最小限度的再 匹配一些,以使整个表达式匹配成功。举例如下,针对文本 “dxxxdxxxd“ 举例:表达式匹配结果(d)(w+?)“w+?“ 将尽可能少的匹配第一个 “d“ 之后的字符,结果是: “w+?“ 只匹配了一个 “x“(d)(w+?)(d)为了让整个表达式匹配成功,“w+?“ 不得不匹配 “xxx“ 才可以 让后边的 “d“ 匹配,从而使整个表达式匹配成功。因此,结果 是:“w+?“ 匹配 “xxx“更多的情况,举例如下:举例 1:表达式 “(.*)“ 与字符串 “aa bb“ 匹配时,匹配的结果是:成功;匹配到的内容是 “aa bb“ 整个字符串, 表达式中的 “将与字符串中最后一个 “ 匹配。 举例 2:相比之下,表达式 “(.*?)“ 匹配举例 1 中同样的字符 串时,将只得到 “aa“, 再次匹配下一个时,可以得到第二 个 “bb“。2.22.2 反向引用反向引用 1,1, 2.2.表达式在匹配时,表达式引擎会将小括号 “( )“ 包含的表达式所匹配到的 字符串记录下来。在获取匹配结果的时候,小括号包含的表达式所匹配到的字 符串可以单独获取。这一点,在前面的举例中,已经多次展示了。在实际应用 场合中,当用某种边界来查

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号