`
zyc1006
  • 浏览: 131705 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

阅读更多



2.9 零宽度断言-2.6 替换 -正则表达式学习笔记 -grule
2.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),结果分别如图和所示。
     
         
  2.9 零宽度断言-2.6 替换 -正则表达式学习笔记 -grule - hxzon00 - hxzon00的博客
               
  2.9 零宽度断言-2.6 替换 -正则表达式学习笔记 -grule - hxzon00 - hxzon00的博客
2.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”。
  2.9 零宽度断言-2.6 替换 -正则表达式学习笔记 -grule - hxzon00 - hxzon00的博客
      以下正则表达式匹配以两个重复字符结尾的单词。
\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所示。
  2.9 零宽度断言-2.6 替换 -正则表达式学习笔记 -grule - hxzon00 - hxzon00的博客
2.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所示。从图中可以看到,两个正则表达式匹配的结果是相同的。
  2.9 零宽度断言-2.6 替换 -正则表达式学习笔记 -grule - hxzon00 - hxzon00的博客
         正则表达式的常用替换说明如表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”。
  2.9 零宽度断言-2.6 替换 -正则表达式学习笔记 -grule - hxzon00 - hxzon00的博客
2.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都均被匹配。
              
  2.9 零宽度断言-2.6 替换 -正则表达式学习笔记 -grule - hxzon00 - hxzon00的博客

分享到:
评论
1 楼 guji528 2012-11-19  
了解了一些零宽度断言部分:
(?=experssion)、(?!experssion)、(?<=experssion)和(?<!experssion)

相关推荐

    正则表达式。包括零宽断言,正则替换的150种表达方式

    新版正则表达式。包括零宽断言,正则替换的150种表达方式

    Excel VBA 正则表达式视频教程

    001_正则表达式初体验.wmv ...020_正则表达式非捕获分组之零宽断言.wmv 021_正则表达式非捕获分组之零宽断言2.wmv 022_正则表达式非捕获分组之负向零宽断言.wmv 023_正则表达式之贪婪与懒惰.wmv 024_正则表达式实例应用

    正则表达式学习教程

    当然,如果你看完了这篇教程之后,发现自己明白了很多,却又几乎什么都记不得,那也是很正常的——我认为,没接触过正则表达式的人在看完这篇教程后,能把提到过的语法记住80%以上的可能性为零。这里只是让你明白...

    正则表达式30分钟入门

    学习正则表达式快速入门的法宝。 语言深入浅出,举例实用、典型。 1、本文目标 2、如何使用本教程 3、正则表达式到底是什么东西? 4、入门 5、测试正则表达式 6、元字符 7、字符转义 8、重复 9、字符类 10、分枝条件...

    qunit-regexp:用于断言正则表达式测试的 QUnit 插件。 使用它的好处是显示字符串和正则表达式值的失败输出

    qunit-正则表达式 用于断言正则表达式测试的 QUnit 插件。 使用它的优点是显示字符串和正则表达式值的失败输出。安装这个模块需要原始的 QUnit(在 npm 上作为qunitjs )才能运行。 npm install --save-dev qunitjs ...

    正则表达式 30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它。

    30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它。 本文目标 如何使用本教程 正则表达式到底是什么东西? 入门 测试正则表达式 元字符 字符转义 重复 字符...

    Python基础入门知识之正则表达式学习 正则表达式30分钟入门教程 共21页.pdf

    三、 正则表达式到底是什么东西? 3 四、 入门 4 五、 测试正则表达式 6 六、 元字符 7 七、 字符转义 9 八、 重复 9 九、 字符类 9 十、 分枝条件 10 十一、 分组 11 十二、 反义 12 十三、 后向引用 12 十四、 零...

    正则表达式30分钟入门教程

    3. 正则表达式到底是什么东西? 4. 入门 5. 测试正则表达式 6. 元字符 7. 字符转义 8. 重复 9. 字符类 10. 分枝条件 11. 反义 12. 分组 13. 后向引用 14. 零宽断言 15. 负向零宽断言 16. 注释 17. ...

    精通正则表达式~~~

    锚点及其他“零长度断言” 129 注释和模式量词... 135 分组,捕获,条件判断和控制... 137 高级话题引导... 142 第4章:表达式的匹配原理.... 143 发动引擎... 143 两类引擎... 144 新的标准... 144 正则...

    正则表达式三十分钟入门教程

    比较全的正则表达式 本文目标 如何使用本教程 正则表达式到底是什么东西? 入门 测试正则表达式 元字符 字符转义 重复 字符类 分枝条件 反义 分组 后向引用 零宽断言 负向零宽断言 注释 贪婪与懒惰 ...

    正则表达式 零宽断言

    正则表达式 零宽断言,,,,,,,,,,,,,,,,,,,,,

    正则表达式经典教程

    正则表达式经典教程,学习的好助手!1. 本文目标 2. 如何使用本教程 3. 正则表达式到底是什么? 4. 入门 5. 测试正则表达式 6. 元字符 7. 字符转义 8. 重复 9. 字符类 10. 反义 11. 替换 12. 分组 13. ...

    正则表达式30分钟入门教程 chm

    正则表达式到底是什么东西? 入门 测试正则表达式 元字符 字符转义 重复 字符类 分枝条件 反义 分组 后向引用 零宽断言 负向零宽断言 注释 贪婪与懒惰 处理选项 平衡组/递归匹配 还有些什么东西没...

    ocaml-re:纯OCaml正则表达式,支持Perl和POSIX样式的字符串

    描述Re是OCaml的正则表达式库。接触该库由Jerome Vouillon( )编写。 可以从下载错误报告,建议和贡献,欢迎。特征支持以下样式的正则表达式: Perl样式的正则表达式(模块Re.Perl ); Posix扩展正则表达式(模块...

    正则表达式入门

    • 正则表达式到底是什么东西? • 入门 • 测试正则表达式 • 元字符 • 字符转义 • 重复 • 字符类 • 分枝条件 • 反义 • 分组 • 后向引用 • 零宽断言 • 负向零宽断言 • 注释 • 贪婪与懒惰 ...

    正则表达式基础入门教程

    正则表达式基础入门教程 1. 本文目标 2. 如何使用本教程 3. 正则表达式到底是什么? 4. 入门 5. 测试正则表达式 6. 元字符 7. 字符转义 8. 重复 9. 字符类 10. 反义 11. 替换 12. 分组 13. 后向引用 14...

    【正则表达式】

    3. 正则表达式到底是什么东西? 4. 入门 5. 测试正则表达式 6. 元字符 7. 字符转义 8. 重复 9. 字符类 10. 分枝条件 11. 反义 12. 分组 13. 后向引用 14. 零宽断言 15. 负向零宽断言 16. 注释 17. ...

    regular-expression-cheat-sheet:正则表达式备忘单-PCRE

    正则表达式备忘单-PCRE 锚 描述 例子 有效匹配 无效的 ^ 字符串或行的开始 泡沫 泡沫 沐浴露 \一种 在任何匹配模式下字符串的开始 \泡沫 泡沫 沐浴露 $ 字符串或行的结尾 完成$ 结束 芬兰 \ Z 字符串的结尾,或...

Global site tag (gtag.js) - Google Analytics