《精通正则表达式》Jeffery Friedl 学习总结
第一章 正则表达式入门
正则表达式赋予使用者描述和分析文本的能力。配合上特定工具提供的额外支持,正则表达式能够添加、删除、分离、叠加、插入和修整各种类型的文本和数据。宿主语言(例如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_.]+”,注意,连字符必须放在字符组的开头,保证它是一个普通字符,而不是用来表示范围。
在深入了解如何调校正则表达式之后,读者会明白,要想在复杂性和完整性之间求得平衡,一个重要的因素是了解待搜索的文本。一个正则表达式的效率优于其他表达式的原因在于,在复杂性、效率和匹配准确性间进行取舍权衡。