读书人

0宽度断言-2.6 替换 -正则表达式学习笔

发布时间: 2012-10-26 10:30:58 作者: rapoo

零宽度断言-2.6 替换 -正则表达式学习笔记 -grule

http://hxzon00.blog.163.com/blog/static/10489241620089101108514/

2.9 零宽度断言-2.6 替换 -正则表达式学习笔记 -grule2.9 零宽度断言?? http://blog.csdn.net/wlzhengzebiaodashi/archive/2008/03/24/2213191.aspx在2.1.1小节中,元字符\b、^、$都匹配一个位置,且这个位置满足一定的条件。在此,把满足这一个条件称为断言或零宽度断言。正则表达式中的常用零宽度断言明如表2-10所示。表2-10零宽度断言字符(断言)说明^匹配行的开始位置。$匹配行的结束位置。\A匹配必须出现在字符串的开头。\Z匹配必须出现在字符串的结尾或字符串结尾处的\换行符号n之前。\z匹配必须出现在字符串的结尾。\G匹配必须出现在上一个匹配结束的地方。\b匹配字符的开始或结束位置。\B匹配不是在字符的开始或结束位置。  在表2-8中,表达式(?=experssion)、(?!experssion)、(?<=experssion)和(?<!experssion)都是匹配一个位置。下面将详细介绍表达式(?=experssion)和(?<=experssion)。  (?=experssion)又称为零宽度正预测先行断言,它断言自身位置的后面能够匹配表达式experssion。以下正则表达式匹配以字符串“ed”结尾的单词的前面部分,即匹配单词的除字符串“ed”之外的部分。\b\w+(?=ed\b)?????????????????????????????? ?????????????????????????????? (73)  (?<=experssion)又称为零宽度正回顾后发断言,它断言自身位置的前面能够匹配表达式experssion。以下正则表达式匹配以字符串“an”开头的单词的后面部分,即匹配单词的除字符串“an”之外的部分。(?<=\ban)\w+\b????????????????????????????????????????????????????????? ????? (74)使用工具Regex Tester分别测试正则表达式(73)和(74),结果分别如图和所示。?????         0宽度断言-2.6 替换 -正则表达式学习笔记 -grule???????????????0宽度断言-2.6 替换 -正则表达式学习笔记 -grule2.8 后向引用  当一个正则表达式被分组之后,每一个组将自动被赋予一个组号,该组号可以代表该组的表达式。其中,组号的编制规则为:从左到右、以分组的左括号“(”为标志,第一个分组的组号为1,第二个分组的组号为2,以此类推。  反向引用提供查找重复字符组的方便的方法。它们可被认为是再次匹配同一个字符串的快捷指令。后向引用可以使用数字命名(即默认名称)的组号,也可以使用指定命名的组号。它们的具体说明如表2-8所示。表2-8后向引用表达式说明\数字使用数字命名的后向引用。\k<name>使用指定命名的后向引用。注意:在表2-8中,表达式\k<name>为.NET Framework所支持。  以下正则表达式匹配具有两个重复字符的单词。\b(\w)\1\b???????????????????????????????????????????????????????????????? ?? (65)注意:正则表达式\b(\w)\1\b和\b(\w)\w\b并不等效,第一个表达式只匹配两个相同字符的单词,而第二个表达式匹配具有两个字符(可以相同,也可以不相同)的单词。  以下正则表达式首先匹配单词的开头处,然后匹配一个字符和数字,再重复该字符和数字,最后是单词的结尾处。\b(\w)(\d)\1\2\b????????????????????????????????????????????????????????? ?????? (66)  使用工具Regex Tester分别测试了正则表达式(65)和\b(\w)\w\b,结果如图所示。在测试结果中,正则表达式\b(\w)\1\b只匹配了单词“aa”,而正则表达式\b(\w)\w\b可以匹配单词“aa”和“ab”。0宽度断言-2.6 替换 -正则表达式学习笔记 -grule      以下正则表达式匹配以两个重复字符结尾的单词。\b\w*(\w+)\1\b??????????????????????????????????????????????????????????? ???? (67)  以下正则表达式匹配重复出现的单词。\b(\w+)\b\s+\1\b???????????????????????????????????????????????????????? ?????? (68)  上述正则表达式\b(\w+)\b\s+\1\b匹配的具体过程如下:(1)表达式\b(\w+)\b匹配一个单词,且单词的长度至少为1;(2)表达式\s+匹配一个或多个空白字符;(3)表达式\1将重复子表达(\w+)匹配的内容,即重复匹配的单词;(4)匹配单词的结束位置。  分组不但可以使用数字作为组号,而且还可以使用自定义名称作为组号。以下两个正则表达式都是将分组后的子表达式\w+命名为“word”。(?<word>\w+)??????????? ????????????????????????????????????????????????? (69)(?'word'\w+)??????????? ??????????????????????????????????????????????????????? (70)  因此,正则表达式\b(\w+)\b\s+\1\b和以下正则表达式等价,它们都匹配重复出现的单词。\b(?<word>\w+)\b\s+\k<word>\b???????????????????????????????????????? (71)  以下正则表达式和正则表达式\b\w*(\w+)\1\b等价,它也是匹配以两个重复字符结尾的单词。\b\w*(?<char>\w+)\k<char>\b?????????????????????????????????????????? (72)  分组子表达式(?<name>)将元字符括在其中,并强制正则表达式引擎记住该子表达式匹配,同时使用“name”将该匹配进行命名。反向引用\k<name>使引擎对当前字符和以名称“name”存储的先前匹配字符进行比较,从而匹配具有重复字符的字符串。正则表达式中的常用分组说明如表2-9所示。表2-9常用分组说明字符说明(experssion)匹配字符串experssion,并将匹配的文本保存到自动命名的组里。(?<name>experssion)匹配字符串experssion,并将匹配的文本以name进行命名。该名称不能包含标点符号,不能以数字开头。(?:experssion)匹配字符串experssion,不保存匹配的文本,也不给此组分配组号。(?=experssion)匹配字符串experssion前面的位置。(?!experssion)匹配后面不是字符串experssion的位置。(?<=experssion)匹配字符串experssion后面的位置。(?<!experssion)匹配前面不是字符串experssion的位置。(?>experssion)只匹配字符串experssion一次。2.7 分组  分组又称为子表达式,即把一个正则表达式的全部或部分分成一个或多个组。其中,分组使用的字符为“(”和“)”,即左圆括号和右圆括号。分组之后,可以将字符为“(”和“)”之中的表达式看成一个整体来处理。以下正则表达式可以匹配重复出现字符串“abc”一次或两次的字符串。此时,表达式将“abc”看成一个整体来进行重复匹配。(abc){1,2}??????????????????????????????????????????????????????????????? ??? (63)  以下正则表达式可以匹配简单的IP地址。(\d{1,3}\.){3}\d{1,3}??????????????????????????????????? ?????????????????????????? (64)  正则表达式式(64)解释:????? \d{1,3}\.先匹配1~3位的整数然后匹配一个字符“.”(点号),如“1.”、“12.”、“123.”、“888.”等。????? (\d{1,3}\.){3}将子表达式\d{1,3}\.匹配的字符串重复3次,如“1.2.3.”、“12.34.56.”、“123.456.789.”、“888.899.569.”等。????? \d{1,3}将匹配1~3位的整数。  综合以上分析,正则表达式(\d{1,3}\.){3}\d{1,3}能够匹配简单的IP地址,如“10.0.0.1”、“123.123.235.235”等。使用工具Regex Tester测试正则表达式(64),结果如图2.25所示。0宽度断言-2.6 替换 -正则表达式学习笔记 -grule2.6 替换 (2)  正则表达式[Jj]ack可以匹配字符串“Jack”或者“jack”。该正则表达式还可以使用替换来实现同样的匹配效果。如下正则表达式等效于正则表达式[Jj]ack。Jack|jack???????????????????????????????????????????????????????????????? ?? (59)  如下正则表达式等效于正则表达式Jack|jack。因此,正则表达式[Jj]ack、Jack|jack和Jack|jack能够匹配的所有字符串是相同。(J|j)ack??????????????????????????????????????????????????????????????????? ????????? (60)  使用工具Regex Tester分别测试正则表达式[Jj]ack和(60),结果分别如图2.21和2.22所示。从图中可以看到,两个正则表达式匹配的结果是相同的。0宽度断言-2.6 替换 -正则表达式学习笔记 -grule         正则表达式的常用替换说明如表2-7所示。表2-7常用替换字符或表达式说明|匹配|(竖线)字符的左侧或右侧。(?(表达式)yes|no)表达式要么可以匹配“yes”部分匹配;要么与“no”部分匹配。其中,“no”部分可省略。(?(name)yes|no)以name命名的字符串要么匹配“yes”部分匹配;要么与“no”部分匹配。其中,“no”部分可省略。注意:字符|在匹配表达式时,它首先匹配|字符的左侧部分。当左侧部分不匹配时,它才尝试匹配|字符的右侧部分。给定以下两个正则表达式\d{5}-\d{3}|\d{5}????????????????????????????????????????????????????????? ????? (61)\d{5}|\d{5}-\d{3}????? ????????????????????????????????????????????????????????? (62)根据字符|的匹配原则(优先匹配左侧表达式),正则表达式\d{5}|\d{5}-\d{3}只会匹配5位的数字字符串,而不会匹配用连接符合连接的8位数字字符串。然而,正则表达式\d{5}-\d{3}|\d{5}能够匹配用连接符合连接的8位数字字符串或者5位的数字字符串。因为,该表达式首先尝试匹配用连接符合连接的8位数字字符串,只有当未匹配时,才匹配5位的数字字符串。使用工具Regex Tester分别测试了正则表达式(61)和(62),测试结果分别如图2.23和2.24所示。正则表达式\d{5}|\d{5}-\d{3}只匹配了字符串“12345”。而正则表达式\d{5}-\d{3}|\d{5}可以匹配字符串“12345-678”和字符串“12345”。0宽度断言-2.6 替换 -正则表达式学习笔记 -grule2.6 替换 (1)  正则表达式0\d{2}-\d{8}和0\d{3}-\d{7}分别匹配区号为3位和4位的固定电话号码,如果需要同时匹配区号为3位和4位的固定电话号码时,使用替换可以满足这一个需求。最简单的替换使用字符“|”表示,它表示如果某一个字符串匹配了正则表达式中的字符“|”的左边或者右边的规则,那么该字符串也匹配了该正则表达式。  以下正则表达式匹配了当前国内部分地区的两种固定电话号码:一种是号码的前4位为区号,后7位为本地号码;另一种是号码的前3位为区号,后8位为本地号码。其中,区号和本地号码都使用连接符号“-”进行连接。0\d{2}-\d{8}|0\d{3}-\d{7}????????????????????????????????????????????? ????? (56)  以下正则表达式匹配了当前国内部分地区的3种固定电话号码:一种是号码的前4位为区号,后7位为本地号码;另一种是号码的前3位为区号,后8位为本地号码;最后一种是号码的前4位为区号,后8位为本地号码。其中,区号和本地号码都使用连接符号“-”进行连接。0\d{2}-\d{8}|0\d{3}-\d{7}|0\d{3}-\d{8}????????????????????????????? ??????? (57)  以下正则表达式匹配当前国内部分地区的区号为4位的固定电话号码。其中,区号和本地号码可以使用连接符号“-”进行连接,也可以不使用连接“-”符号。0\d{3}-\d{7}|0\d{3}[-]?\d{7}??????????????????????????????????????????? ????? (58)  使用工具Regex Tester测试正则表达式(58),测试结果如图所示。其中,电话号码0731-1234567和07311234567都均被匹配。              0宽度断言-2.6 替换 -正则表达式学习笔记 -grule

读书人网 >编程

热点推荐