学习正则表达式【一】
2016-07-18 12:08
218 查看
《精通正则表达式》Jeffery Friedl 学习总结
egrep能够理解文件中的字节和行,但它完全不理解英语(或者其他任何语言)的单词、句子、段落、或者是其他复杂概念。最好养成按照字符来理解正则表达式的习惯。例如“^cat”匹配的是以c作为一行的第一个字符,紧接一个a,紧接一个t的文本,而非匹配以cat开头的行。
在字符组内部,字符组元字符“-”(连字符)表示一个范围:“<H[1-6]>”与“<H[123456]>”是完全一样的。多重范围也是容许的,例如“[01234abcd]”可以写作“[0-4a-d]”。请注意,只有在字符组内部,连字符才是元字符——否则它就只能匹配普通的连字符号。
“[^1-6]”匹配除了1到6以外的任何字符。这个字符中开头的“^”表示“排除(negate)”。注意,一个字符组,即使是排除型字符组,也需要匹配一个字符。
“% egrep -i '^{From|Subject|Date}:' mailbox”,结果除了包含前述内容外,还包含这一行“SUBJECT:MAKE MONEY FAST”。
其中的子表达式匹配的文本,不论这些文本是什么,元字符序列“\1”都能记住它们。
在深入了解如何调校正则表达式之后,读者会明白,要想在复杂性和完整性之间求得平衡,一个重要的因素是了解待搜索的文本。一个正则表达式的效率优于其他表达式的原因在于,在复杂性、效率和匹配准确性间进行取舍权衡。
第一章 正则表达式入门
正则表达式赋予使用者描述和分析文本的能力。配合上特定工具提供的额外支持,正则表达式能够添加、删除、分离、叠加、插入和修整各种类型的文本和数据。宿主语言(例如Perl、Java以及VB.NET)提供了外围的处理支持,但是真正的能力来自正则表达式。1 检索文本文件:egrep
在指定了正则表达式和需要检索的文件之后,egrep会尝试用正则表达式来匹配每个文件的每一行,并显示能够匹配的行。egrep能够理解文件中的字节和行,但它完全不理解英语(或者其他任何语言)的单词、句子、段落、或者是其他复杂概念。最好养成按照字符来理解正则表达式的习惯。例如“^cat”匹配的是以c作为一行的第一个字符,紧接一个a,紧接一个t的文本,而非匹配以cat开头的行。
2 字符组
“[…]”,正则表达式结构体。它容许使用者列出在某处希望匹配的字符,通常被成为字符组。正则表达式“[ea]”能匹配e或者a。所以“gr[ea]y”的意思是:先找到g,跟着一个是r,然后是一个e或者a,最后是一个y。在字符组内部,字符组元字符“-”(连字符)表示一个范围:“<H[1-6]>”与“<H[123456]>”是完全一样的。多重范围也是容许的,例如“[01234abcd]”可以写作“[0-4a-d]”。请注意,只有在字符组内部,连字符才是元字符——否则它就只能匹配普通的连字符号。
“[^1-6]”匹配除了1到6以外的任何字符。这个字符中开头的“^”表示“排除(negate)”。注意,一个字符组,即使是排除型字符组,也需要匹配一个字符。
3 忽略大小写
egrep的命令行参数“-i”表示进行忽略大小写的匹配。把“-i”写在正则表达式之前:“% egrep -i '^{From|Subject|Date}:' mailbox”,结果除了包含前述内容外,还包含这一行“SUBJECT:MAKE MONEY FAST”。
4 单词分界符
请注意,“<”和“>”本身并不是元字符——只有当它们与斜线结合起来的时候,整个序列才具有特殊意义。5 其他量词
问号、加号和星号这3个元字符,统称为量词,因为它们限定了所作用元素的匹配次数。量词作用的对象是它们之前紧邻的子表达式。所以“mis+pell”中“+”作用的是“s”,而非“mis”或者“is”。6 括号及反向引用
在许多流派的正则表达式中,括号能“记住”它们包含的子表达式匹配的文本。反向引用是正则表达式的特性之一,它容许我们匹配与表达式先前部分匹配的同样的文本。在支持反向引用的工具软件中,括号能够记忆其中的子表达式匹配的文本,不论这些文本是什么,元字符序列“\1”都能记住它们。
7 HTML URL
“[-a-z0-9_.]+”,注意,连字符必须放在字符组的开头,保证它是一个普通字符,而不是用来表示范围。在深入了解如何调校正则表达式之后,读者会明白,要想在复杂性和完整性之间求得平衡,一个重要的因素是了解待搜索的文本。一个正则表达式的效率优于其他表达式的原因在于,在复杂性、效率和匹配准确性间进行取舍权衡。
相关文章推荐
- Twitter Heron阅读笔记
- Codeforces Round #309 (Div. 2) C 排列组合+费马小
- 虚拟机,开发板,主机 相互ping通
- NYOJ35表达式求值
- NGUI拖动摄像机实现面板上下拖动
- NODE.JS的简单的例子
- 入门级大数据解决方案
- eclipse+padWalker+perl 环境搭建
- 通过继承实现多态(小学生日常)
- 【杭电】[1865]1sting
- Java JVM:内存溢出(栈溢出,堆溢出,持久代溢出以及 nable to create native thread)
- codeforces 696C PLEASE 概率dp+公式递推+费马小定理
- Android中的基础----android:gravity和android:layout_gravity的使用原则和区别
- GP学习(七)—Accessing raster workspaces
- 通达OA列表控件添加js代码,实现js的获取和赋值
- Android AllView使用效果
- i3 i5 i7的区别
- Android Studio修改项目编译版本
- BestCoder 2nd Anniversary/HDU 5719 姿势
- 真机测试的时候出现 data parameter is nil