1

本书关注的是一种强大的工具——“正则表达式”。它将教会读者如何使用正则表达式解决各种问题,以及如何充分使用支持正则表达式的工具和语言。许多关于正则表达式的文档都没有介绍这种工具的能力,而本书的目的正是让读者“精通”正则表达式。许多种工具都支持正则表达式(文本编辑器、文字处理软件、系统工具、数据库引擎,等等),不过,要想充分挖掘正则表达式的能力,还是应当将它作为编辑语言的一部分。例如Java、JScript、VisualBasic、VBScript、JavaScript、ECMAScript、C、C++、C#、elisp、Perl、Python、Tcl、Ruby、PHP、sed和awk。事实上,在一些用上述语言编写的程序中,正则表达式扮演了极其重要的角色。正则表达式能够得到众多语言和工具的支持是有原因的:它们极其有用。从较低的层面上来说,正则表达式描述的是一串文本(achunkoftext)的特征。读者可以用它来验证用户输入的数据,或者也可以用它来检索大量的文本。从较高的层面上来说,正则表达式容许用户掌控他们自己的数据——控制这些数据,让他们为自己服务。掌握正则表达式,就是掌握自己的数据。
——来自本书序言

正则表达式入门

本篇写的是正则表达式入门的内容,包括元字符及其相关术语,以及一些简单的语言差异。


元字符

1.脱字符和美元符

字符^是脱字符,可以锚定一行文本的开头;字符$是美元符,可以锚定一行文本的结束.注意,这里匹配的都是位置,而不是字符或者内容。

2.字符组

字符组是指用方括号包围起来的字符,类似[...]。匹配的内容是是一个字符1。要注意的是,字符组内部也有元字符,且字符组外部的元字符在字符组内部无意义。

-是连字符,在字符组的两个字符中间可以表示一个范围,如[1-6]可以表示[123456]。在字符组中,如果要匹配连字符,最好放在最前面2

^放在字符组开头,则成为一个排除型字符组,会匹配除了排除型字符组中所有字符的字符。

3.匹配任意字符

.(dot)可以匹配任意字符(除了.自身)。要注意的是,这个.可能被滥用,最好在使用前考虑清楚:检索的文本是否会对表达式造成干扰?是否都是固定格式?

4.多选结构

可以用|来表示。这个元字符可以把多个子表达式组合起来,只要求匹配其中一个即可。这时,子表达式又称作“多选分支”(alternative)。

由于字符组只能匹配单个字符,而多选结构则可以匹配字符串,弥补了它的缺陷。

5.忽略大小写

在Python中,使用参数i打开。在英文中,经常出现这中需要。而忽略大小写就可以避免某些人由于打错字或者对单词的不熟悉导致的问题。

6.单词分界符

在Python中,使用\b作为其分界符。

在egrep中,使用<\\>来做分界符。

分界符可以对单词的起始和结束位置进行检查,而不至于将一个单词从另一个单词中分离。

7.可选项元素

?在一个字符或者分组后面,意为着其匹配的内容允许出现,但是不出现也没问题。

8.量词

*、+和?的位置相同,实际上是对其匹配内容出现的次数做一个限定

+:要求匹配的内容出现一次及以上。

*:要求匹配的内容出现0次及以上3

如果需要指定出现的次数,可以使用{m,n},匹配内容m次到n次。

9.括号

如果需要使用分组,或者对一个分组进行量词限定,就可以使用它了。使用括号以后,可以:

  • 在后面进行反向引用

  • 作为一个子表达式使用

  • 限制多选结构

10.转义符

对正则表达式的元字符进行转义,实际上就是加一个\实现。比如\(\)就是指一个括号,而不是一个分组。

11. 总结

元字符 名称 功能
. 匹配单个任意字符
[...] 字符组 匹配单个字符组出现的字符
[^...] 排除型字符组 匹配单个未在字符组出现的字符
\char 转义符 如果char是元字符或没有特殊含义, 则匹配char。
? 问号 容许非必须的一次匹配
+ 加号 匹配1次以上
* 星号 匹配任意次
{min,max} 区间量词 匹配min次到max次。
^$ 脱字符和美元符 匹配一行文本的开头和结束。
\b 边界符 匹配单词的边界
| | 多选结构
(...) 括号 用处有三,请看上面
\1.\2 反向引用 对括号捕捉到的分组进行引用。

  1. 就是说,如果没有字符就不会匹配。
  2. 比如,[.-\]并不是匹配三个字符,而是匹配从.到\之间的字符的范围。
  3. 任意次数可选。

yibohu1899
264 声望17 粉丝