- 浏览: 40577 次
- 性别:
- 来自: 上海
最新评论
Linux正则表达式的模式修正符与元字符在前面两篇我们已经介绍了,因为网上现有的正则表达式资料都对这部分都有详细的介绍和众多的例子,如果觉得对前一部分缺乏了解可以参看这些资料。本文希望可以尽可能多涉及一些较高级的正则表达式特性。
在本文里,我们主要介绍Linux正则表达式的子模式(subpatterns),逆向引用(Back references)和量词(quantifiers),其中重点介绍对这些概念的一些扩展应用,例如子模式中的非捕获子模式,量词匹配时的greedy与ungreedy。
子模式(subpatterns)与逆向引用(Back references)
正则表达式可以包含多个字模式,子模式由圆括号定界,可以嵌套。这也是两个元字符"("和")"的作用。子模式可以有以下作用:
1. 将多选一的分支局部化。
例如,模式: cat(aract|erpillar|)匹配了 "cat","cataract" 或 "caterpillar" 之一,没有圆括号的话将匹配 "cataract","erpillar" 或空字符串。
2. 将子模式设定为捕获子模式(例如上面这个例子)。当整个模式匹配时,目标字符串中匹配了子模式的部分可以通过逆向引用进行调用。左圆括号从左到右计数(从 1 开始)以取得捕获子模式的数。
注意,子模式是可以嵌套的,例如,如果将字符串 "the red king" 来和模式 /the ((red|white) (king|queen))/进行匹配,捕获的子串为 "red king","red" 以及 "king",并被计为 1,2和 3 ,可以通过"1","2","3"来分别引用它们,"1"包含了"2"和"3",它们的序号是由左括号的顺序决定的。
在一些老的Linux/unux工具里,子模式使用的圆括号需要用反斜线转义,向这种(subpattern),但现代的工具已经不需要了,本文中使用的例子都不进行转义。
非捕获子模式(non-capturing subpatterns)
用一对括号同时完成上面提到的子模式的两个功能有时会出现一些问题,例如,由于逆向引用的数目是有限的(通常最大不超过9),而且经常会遇到无需捕获的子模式定义。这时,可以在开始的括号后加上问号和冒号来表示这个子模式无需捕获,就向下面这样:((?:red|white) (king|queen))。
如果将"the white queen"作为模式匹配的目标字符串,则捕获的字串有"white queen"和"queen",分别作为"1"和"2",white虽然符合子模式"(?:red|white)",但并不被捕获。
我们前面已经介绍过用括号与问号表示模式修正符的方法,为方便起见,如果需要在非捕获子模式中插入模式修正符,可以把它直接放在问号和冒号之间,例如,下面两个模式是等效的。
/(?i:saturday|sunday)/和/(?:(?i)saturday|sunday)/。
逆向引用(Back references)
前面介绍反斜线作用时,已经提到它的一个作用就是表示逆向引用,当字符类之外的反斜线后跟一个大于0的十进制数时,它很有可能是一个逆向引用。它的含义正如它的名称如言,它表示对它出现之前已经捕获的子模式的引用。这个数字代表了它引用的左括号在模式中出现的次序,我们在介绍子模式时已经看到过逆向引用的一个例子,那里的过"1","2","3"分别表示所捕获的第一,第二,和第三个小括号定义的子模式的内容。
值得注意的是,当反斜线后的数字小于10时,可以确定此为一个逆向引用,这样,这个逆向引用就可以出现在之前有相应数目的左圆括号被捕获前而不会出现混淆,只有整个模式能提供那么多的捕获子模式,就不会报错。说起来似乎很混乱,还是让我们来看下面这个例子。把介绍子模子时举的例子拿来修改一下,前面讲过字符串 "the red king" 来和模式 /the ((red|white) (king|queen))/匹配,捕获的子串为 "red king","red" 以及 "king",并被计为 1,2和 3 ,现在把字符串,修改为" king,the red king",模式改为/3,the ((red|white) (king|queen))/,这个模式应该也是可以匹配的。不过,并非所有的正则表达式工具都支持这种用法,安全的做法是在相应序号的左括号之后使用与之相关的逆向引用。
需要注意的另一点是逆向引用的值是在目标字符串中实际捕获的符合子模式的字符串片段而非该子模式本本身。例如/ (sens|respons)e and 1ibility/会匹配"sense and sensibility" 和 "response and responsibility",但不会是 "sense and responsibility"。当被逆向引用的子模式后面有量词从而被重复匹配了多次,逆向引用的值会以最后一次匹配的值为准。例如/([abc]){3}/匹配字符串"abc"时,逆向引用"1"的值将是最后一次匹配的结果"c"。
相信这里大家对Linux正则表达式的子模式(subpatterns)与逆向引用(Back references)已经有所了解了,后面还有更精彩内容。
发表评论
-
格式化字符串攻击原理及示例
2012-07-06 09:51 601一、类printf函数簇 ... -
12章 正则表达式
2012-07-06 09:45 726笔记: 1. 正则表达式是一种"表示法&q ... -
C#实现屏幕录像 网上看到的看起来不错
2012-07-06 09:30 1619using System; using System. ... -
实现google的下拉列表效果
2012-07-05 20:45 772 -
Wix使用笔记(七) 添加系统必备组件的安装程序
2012-07-03 13:43 1291我们知道在vs的打包工程中添加系统必备组件是一件很容易的事 ... -
使用Flex和Actionscript开发Flash游戏――碰撞检测
2012-07-02 10:32 540这一部分,我们加 ... -
flex+blazeds+java(将java整合到flex中)
2012-07-02 10:32 563最近项目中需要Flex与Java进行通信,初步选定使用Bl ... -
Flex 捆绑式验证处理
2012-07-02 10:32 549Flex提供的默认的验证器,比如:日期验证器、货币验证器等 ... -
flex用弹出窗体展示gif
2012-07-02 10:31 498GIFPlayer用于在flex中展示GIF图片。 ... -
Flex4 中使用ModuleLoader为子容器 动态加入到TabNavigator导航器容器中的例子
2012-07-01 00:10 576经常在一些工程中看到 选择左侧目录树 右侧添加TAB加载内 ... -
flex用弹出窗体展示gif
2012-07-01 00:10 562GIFPlayer用于在flex中展示GIF图片。 ... -
为什么使用Flex库
2012-07-01 00:10 535上个星期,我写了 ... -
flex动态生成矢量swf字体--java动态生成swf文件
2012-07-01 00:10 908前言 相信很多在线设计的前端WEB应用会用到字体作为素材的 ... -
Flex 遍历组件的实现
2012-07-01 00:10 693Flex有两个阵营组件:spark组件和mx组件,关于sp ...
相关推荐
Linux正则表达式.pdf 学习资料 复习资料 教学资源
linux 正则表达式 总结 正则 表达式
如果你曾经用过Perl或任何其他内建正则表达式支持的语言,你一定知道用正则表达式处理文本和匹配模式是多么简单。如果你不熟悉这个术语,那么“正则表达式”(Regular Expression)就是一个字符构成的串,它定义了一...
正则表达式,正则表达式,正则表达式 正则表达式 正则表达式 正则表达式 正则表达式 正则表达式 正则表达式
常用正则表达式 正则表达式 常用正则表达式 正则表达式
Linux正则表达式技术指南Linux正则表达式技术指南Linux正则表达式技术指南
绝对有用的LINUX正则表达式使用,包含awk,sed,cut,tr等使用技巧,希望大家喜欢!
正则表达式.rar正则表达式.rar正则表达式.rar正则表达式.rar
《学习正则表达式》从正则表达式的基本概念讲起,到编写完整的sed和Perl脚本,再到转换HTML文件,将这种强大的工具解释得清晰透彻。...《学习正则表达式》适合对正则表达式感兴趣的程序员和互联网从业者。
正则表达式验证工具 V1.0 ...三、符合正则表达式的显示True 4、选择是否不区分大小写(RegexOptions.IgnoreCase),单行模式(RegexOptions.Singleline)还是多行模式(RegexOptions.Multiline) 5、点击“运行”。
正则表达式正则表达式正则表达式正则表达式正则表达式正则表达式正则表达式正则表达式正则表达式正则表达式正则表达式正则表达式正则表达式正则表达式正则表达式正则表达式正则表达式正则表达式正则表达式正则表达式...
正则表达式正则表达式正则表达式正则表达式 验证程序
正则表达式日期校验 正则表达式日期校验 正则表达式日期校验
Java正则表达式Java正则表达式Java正则表达式Java正则表达式
正则表达式帮助 有用的正则表达式帮助 有用的正则表达式帮助 有用的正则表达式帮助 有用的
[Linux基础]_05_常用的文本过滤工具 Linux正则表达式 三种表达方式
《正则表达式经典实例》讲解了基于8种常用的编程语言使用正则表达式的经典实例。书中提供了上百种可以在实战中使用的实例,以帮助读者使用正则表达式来处理数据和文本。对于如何使用正则表达式来解决性能不佳、误报...
正则表达式 正则表达式正则表达式正则表达式正则表达式正则表达式正则表达式正则表达式
linux系统shell正则表达式-练习工具和教材 正则表达式-练习工具和教材 正则表达式-练习工具和教材
正则表达式 详解 基础 正则表达式之道(A Tao of Regular Expressions)