正则表达式必知必会
上QQ阅读APP看书,第一时间看更新

1.1 正则表达式的用途

正则表达式(regular expression,简称regex)是一种工具,和其他工具一样,它是人们为了解决某一类专门的问题而发明的。要想理解正则表达式及其功用,最好的办法是了解它们可以解决什么样的问题。

请考虑以下几个场景:

❑ 你正在搜索一个文件,这个文件里包含着单词car(不区分字母大小写),但你并不想把包含着字符串car的其他单词(比如scar、carry和incarcerate,等等)也找出来。

❑ 你打算用一种应用服务器来动态地生成一个Web网页以显示从某个数据库里检索出来的文本。在那些文本里可能包含着一些URL地址字符串,而你希望那些URL地址在最终生成的页面里是可点击的(也就是说,你打算生成一些合法的HTML代码——<A HREF></A>——而不仅仅是普通的文本)。

❑ 你创建了一份包含着一张表单的Web页面,这张表单用来收集用户信息,其中包括一个电子邮件地址。你需要检查用户给出的电子邮件地址是否符合正确的语法格式。

❑ 你正在编辑一段源代码并且要把所有的size都替换为isize,但这种替换仅限于单词size本身而不涉及那些包含着字符串size的其他单词。

❑ 你正在显示一份计算机文件系统中所有文件的清单,但你只想把文件名里包含着Application字样的文件列举出来。

❑ 你正在把一些数据导入应用程序。那些数据以制表符作为分隔符,但你的应用程序要支持CSV格式(每条记录独占一行,同一条记录里的各项数据之间用逗号分隔并允许被括在引号里面)。

❑ 你需要在文件里搜索某个特定的文本,但你只想把出现在特定位置的(比如每行的开头或是每条语句的结尾)找出来。

以上场景都是大家在编写程序时经常会遇到的问题,用任何一种支持条件处理和字符串操作的编程语言都可以解决它们——但问题是你的解决方案将会变得十分复杂。比较容易想到的办法是,用一些循环来依次遍历那些单词或字符并在循环体里面用一系列if语句来进行测试,这往往意味着你需要使用大量的标志来标记你已经找到了什么,你还没有找到什么,还需要检查空白字符和特殊字符,等等。而这一切都需要以手工方式来进行。

另一种解决方案是使用正则表达式。上述问题都可以用一些精心构造的语句——或者说一些由文本和特殊指令构成的高度简练的字符串来解决,比如像下面这样的语句:

\b[Cc][Aa][Rr]\b

注意 如果你现在还看不懂这一行,先别着急。你很快就会知道它的含义是什么。