- 浏览: 42669 次
- 性别:
- 来自: 上海
-
最新评论
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 646一、类printf函数簇 ... -
12章 正则表达式
2012-07-06 09:45 797笔记: 1. 正则表达式是一种"表示法&q ... -
C#实现屏幕录像 网上看到的看起来不错
2012-07-06 09:30 1676using System; using System. ... -
实现google的下拉列表效果
2012-07-05 20:45 807 -
Wix使用笔记(七) 添加系统必备组件的安装程序
2012-07-03 13:43 1333我们知道在vs的打包工程中添加系统必备组件是一件很容易的事 ... -
使用Flex和Actionscript开发Flash游戏――碰撞检测
2012-07-02 10:32 567这一部分,我们加 ... -
flex+blazeds+java(将java整合到flex中)
2012-07-02 10:32 584最近项目中需要Flex与Java进行通信,初步选定使用Bl ... -
Flex 捆绑式验证处理
2012-07-02 10:32 576Flex提供的默认的验证器,比如:日期验证器、货币验证器等 ... -
flex用弹出窗体展示gif
2012-07-02 10:31 523GIFPlayer用于在flex中展示GIF图片。 ... -
Flex4 中使用ModuleLoader为子容器 动态加入到TabNavigator导航器容器中的例子
2012-07-01 00:10 615经常在一些工程中看到 选择左侧目录树 右侧添加TAB加载内 ... -
flex用弹出窗体展示gif
2012-07-01 00:10 597GIFPlayer用于在flex中展示GIF图片。 ... -
为什么使用Flex库
2012-07-01 00:10 581上个星期,我写了 ... -
flex动态生成矢量swf字体--java动态生成swf文件
2012-07-01 00:10 931前言 相信很多在线设计的前端WEB应用会用到字体作为素材的 ... -
Flex 遍历组件的实现
2012-07-01 00:10 727Flex有两个阵营组件:spark组件和mx组件,关于sp ...
相关推荐
本书《快速完全精通正则表达式》旨在为读者提供一个全面深入学习正则表达式的平台,无论你是初学者还是有一定经验的程序员,都能从中获益匪浅。通过本书的学习,你将能够掌握如何在各种编程环境中运用正则表达式解决...
在编程、数据处理和文本分析领域,正则表达式扮演着至关重要的角色。本详细教程将带你深入理解和掌握这一技术。 《精通正则表达式.pdf》这本书是学习正则表达式的经典教材,它涵盖了正则表达式的各种核心概念,如...
《1.grep命令与正则表达式.md》文件将介绍如何在Linux或Unix系统中使用grep命令结合正则表达式进行文件搜索。grep是强大的文本查找工具,通过指定正则表达式,可以快速在大量文本中找到符合模式的行。例如,你可以...
而《regexbuddy 4.9》就是专为正则表达式设计的一款测试和调试工具,它为程序员和数据分析师提供了强大的支持。 《regexbuddy》的功能强大且全面,包括以下几个主要方面: 1. **创建正则表达式**:通过直观的界面...
总结来看,本文提供的信息相当全面,涵盖了Linux环境下正则表达式的使用,以及sed和awk这两种文本处理工具的基本语法和高级用法。通过对这些工具和正则表达式的深入理解和学习,读者将能够更加高效地处理和分析文本...
# 精通 Delphi 文本处理:正则表达式的全面应用 在软件开发领域,文本处理是一项极其重要且常见的任务。Delphi作为一种强大的编程语言,不仅具备出色的性能,还支持面向对象编程,并且拥有丰富的组件库以加速开发...
总结,GNU.regexp-1.1.4库为Java开发者提供了一套全面的正则表达式处理工具,其强大的功能和易用的API使得处理文本变得更加便捷。无论是简单的字符串查找还是复杂的模式匹配,都能得心应手。对于需要处理大量文本或...
正则表达式(Regular Expression),简称regex或regexp,是一种用于处理字符串的强大工具,在多种编程语言和操作系统中都有广泛的应用,如*nix(包括Linux和Unix)、PHP、C#、Java等。它们在模式匹配、搜索和替换...
正则表达式是一种强大的文本处理工具,用于匹配、查找、替换和分析字符串模式。它在各种编程语言和操作系统中都得到了广泛的应用,如*nix(包括Linux和Unix)、HP操作系统,以及PHP、C#、Java等开发环境。本文将深入...
"正则表达式30分钟入门教程.pdf"可能包含了从基础概念如字符类、量词、锚点到高级特性的全面介绍,如分组、后向引用和正向预查。 sed是一个流编辑器,它可以逐行读取输入,对文本进行操作,然后将结果发送到标准...
通过上述的详细解释,读者应能对正则表达式的概念、特点、组成及其在shell脚本中的应用有一个全面的了解。对于那些想要深入学习和掌握正则表达式的读者,建议在实践中不断尝试和积累经验,以便熟练运用。
在IT领域,特别是Web开发,PHP、Linux、正则表达式和HTTP服务器配置等知识是不可或缺的。这个压缩包文件包含了一系列重要的学习资源,对于初学者或者希望提升技能的开发者来说,是一个非常宝贵的学习工具。 首先,...
这些工具通过正则表达式来查找、替换或者分析文本文件,是Unix/Linux系统的精髓所在。本书深入浅出地介绍了如何构建和使用正则表达式,帮助读者从基础到高级全面掌握这一技能。 首先,正则表达式的基础包括字符集、...
3. 全面的元字符和语法支持:RegExr.air包含了所有常见的正则表达式元字符和语法,如`.`、`*`、`+`、`^`、`$`、`\d`、`\w`等,用户可以轻松创建复杂的匹配规则。 4. 帮助文档集成:软件内置了详尽的正则表达式参考...
4. **解释和分析**:对于复杂的正则表达式,RegexBuddy能够进行深入的分析,解释每一步的匹配过程,帮助用户理解其工作原理。这对于初学者来说尤其有价值,因为它可以避免因不理解正则表达式而导致的错误。 5. **...
源码程序是理解任何软件工作原理的基础,通过阅读和分析grep的源码,我们可以深入理解其内部机制,包括如何解析命令行参数、如何构建正则表达式、如何高效地搜索文本以及如何处理匹配结果等。 1. **命令行参数解析*...
《PCRE库详解:pcre-8.35版本解析》 ...无论是开发Web应用、文本分析工具还是其他需要文本匹配功能的项目,PCRE都能提供高效、全面的支持。了解并掌握其特性和使用方法,对于提升软件的文本处理能力具有重要意义。
2. 正则表达式:正则表达式是一种强大的文本处理工具,它可以用来描述复杂的文本模式,用于文本搜索、替换和其他处理。Shell脚本中的许多命令,比如`grep`、`awk`、`sed`等,都支持正则表达式。 3. `grep`:`grep`...
总的来说,《Linux下的Perl编程》是一本全面介绍在Linux系统中使用Perl5进行开发的书籍,涵盖了从基础语法到高级特性的完整知识体系,对于想要提升Linux环境下Perl编程能力的开发者来说,是一本非常有价值的参考资料...