1.1 正则表达式的用途
和其他工具一样,正则表达式是人们为了解决特定的问题而发明的一种工具。要想理解正则表达式及其功用,最好的办法是了解它可以解决什么样的问题。
请考虑以下几个场景。
你正在搜索一个文件,这个文件里包含单词car(不区分字母大小写),但你并不想把包含字符串car
的其他单词(比如scar
、carry
和incarcerate
等)也找出来。
你打算生成一个网页以显示从某个数据库里检索出来的文本。在那些文本里可能包含一些URL地址字符串,而你希望那些URL地址在最终生成的页面里是可点击的(也就是说,你打算生成一些合法的HTML代码——<a href></a>
——而不仅仅是普通的文本)。
你创建了一个包含一张表单的应用程序,这个应用程序负责收集包括电子邮件地址在内的用户信息。你需要检查用户给出的电子邮件地址是否符合正确的语法格式。
你正在编辑一段源代码并且要把所有的size
都替换为isize
,但这种替换仅限于单词size
本身,并不涉及那些包含字符串size
的其他单词。
你正在显示一份计算机文件系统中所有文件的清单,但你只想把文件名里包含Application
字样的文件列举出来。
你正在把一些数据导入应用程序。那些数据以制表符作为分隔符,但你的应用程序要支持CSV格式(每条记录独占一行,同一条记录里的各项数据之间用逗号分隔,数据允许出现在引号内)。
你需要在文件里搜索某个特定的文本,但你只想把出现在特定位置(比如每行的开头或是每条语句的结尾)的文本找出来。
以上场景是大家在编写程序时经常会遇到的问题,用任何一种支持条件处理和字符串操作的编程语言都可以解决,但问题是这种解决方案会变得十分复杂。比较容易想到的办法是,用一些循环来依次遍历那些单词或字符并在循环体里面用一系列if
语句来进行测试,这往往意味着你需要使用大量的标志来记录已经找到了什么、还没有找到什么,另外少不了要检查空白字符和特殊字符,等等。而这一切都需要一遍又一遍地以手工方式进行。
另一种解决方案是使用正则表达式。上述问题都可以用一些精心构造的语句,或者说一些由文本和特殊指令构成的高度简练的字符串来解决,比如像下面这样的语句:
\b[Cc][Aa][Rr]\b
注意 如果现在还看不懂这一行,先别着急,你很快就会知道它的含义是什么。