松鼠
2018/7/23
从今天起开始正则表达式的学习,凭此系列博客作为读书笔记和心得记录,一些思考和想法也会笔耕于此。
第一章:正则表达式入门(Introduction to regex)
首先需要理解这玩意是干啥的,为啥我们要学这玩意。学编程是避不开字符串的各种杂七杂八的处理的,说到底程序还是字符串堆砌,无论是搞爬虫是我们需要定向检索某一类的资源,或是数据库对各种信息的处理,亦或是最单纯的提取我们需要的各类文字、数字,我们总是希望使用某种方式直接获得我们想要的东西,跟其他方法比起来,正则有得天独厚的优势,具体细节暂且不表。
-
正则语句组成结构
完整的正则表达式由元字符(metacharacters)和普通文本字符(normal text characters)组成,简单来说,元字符就是语法功能,普通文本字符就是文本,元字符对文本的操作控制是以一个单元(unit)为基础的,元字符会对整个单元起作用。
-
元字符种类
脱字符号 ⌈^⌋:表示匹配行的起始,如 ⌈^cat⌋ 表示行起始后的第一个字符是 ⌈c⌋,然后是 ⌈a⌋,然后是⌈t⌋。
美元符号 ⌈$⌋:表示匹配行的结束,如⌈t$⌋表示行的结束之前的最后一个字符是⌈t⌋。
以上两种符号的特殊之处在于他们匹配的是位置,而不是具体的文本。
-
字符组 (character classes)
字符组[……]可以理解为一个“或运算”,字符组中的字符有且仅有一个字符可以匹配,如⌈ca[rt]⌋能匹配且仅能匹配⌈car⌋或⌈cat⌋。字符组元字符(character-class metacharacter)是仅在字符组中适用的元字符,连字符‘-’就是典型的例子,在字符组中表示范围,如⌈[0-9]⌋、⌈[a-z]⌋,需要注意的是:‘-’在字符组内部中时才是元字符,而且前后必须是合法范围,如⌈[-az]⌋表示⌈-⌋或⌈a⌋或⌈z⌋,一定要注意逻辑上是否存在谬误。‘-’在字符组外部就是一个普通文本字符,不可混淆。
排除型字符组:⌈[^……]⌋表示一个“或非”操作,如⌈[^0-9]⌋表示匹配一个非0到9的字符,需要注意的是:排除型字符组一定会有一个匹配,匹配不到是不可接受的,⌈^⌋只有在字符组内部才是元字符,在外部是行锚点(line anchor)。
-
点号⌈.⌋
点号可以匹配任意字符,这里包括空格,需要强调空格符也是一个字符。点号的匹配范围过于宽泛,可能会获得大量希望之外的结果,需要多加限制。
-
多选结构(alternation)
⌈|⌋,或运算,跟括号配合,可以起到比字符组更灵活的筛选功能,字符组只能对字符或运算,⌈|⌋可以筛选子表达式,一个二级结构出现了。⌈(|)⌋是一个常见的结构。
-
egrep中的 -i 命令可以忽略大小写。
-
单词标识符
为了避免希望匹配的单词在另一个单词里面,可采用⌈\<⌋,⌈\>⌋定位单词开始结束位置。⌈\<⌋是一个元字符序列。
-
可选项元素-量词(?+*)
⌈?⌋表示其作用的的单元可出现一次可以不出现,如⌈colou?r⌋表示u可有可无,⌈color⌋,⌈colour⌋均可匹配成功。
⌈+⌋表示其作用的的单元至少出现一次,如⌈[0-9]+⌋可匹配所有数字。若一次都没有匹配成功就会报错。
⌈*⌋表示其作用的单元爱出现几次都行,0到任意大都是可以的,也不会报错。
有时用{min,max}可规定确切匹配的区间。
-
括号和反向引用
大部分情况下括号可以记住其内部子表达式的匹配内容,我们可以通过⌈\1⌋反向调用,⌈\2⌋,⌈\3⌋依次匹配后面的括号内容。
此方法多用于寻找重复字符。
-
转义
⌈\⌋转义符,加元字符可以消除元字符本身的特性,恢复其普通的含义,反之⌈\⌋加普通字符可能产生元字符的特性。