什么是正则表达式,简单地说,正则表达式是一些用来匹配和处理文本的字符串。正则表达式是用正则表达式语言创建的,这种语言专门用来解决我们后面描述的一些问题。与其他程序语言一样,正则表达式语言也是有必要要学习的特殊语法和指令。
正则表达式语言并不是一种完备的程序设计语言,它甚至算不上是一种能够直接安装并运行的程序或实用工具。更准确地说,正则表达式语言是内置于其他语言或者软件产品里的“迷你”语言。好在现在几乎所有的语言或工具都支持正则表达式,但是正则表达式与你正在使用的语言或工具可以说毫无相似之处。
正则表达式的用途
和其他工具一样,正则表达式是人们为了解决特定的问题而发明的一种工具,要想理解正则表达式及其功用,最好的办法是了解它可以解决什么样的问题。请考虑如下几个场景:
- 你正在搜索一个文件,这个文件里包含单词
car
(不区分字母大小写),但你并不想把包含字符串car
的其他单词(如:scar, carry和incarcerate等)也找出来。 - 你打算生成一个网页以显示从某个数据库里检索出来的文本。在那些文本里可能包含一些 URL 地址字符串,而你希望那些 URL 地址在最终生成的页面里是可点击的(也就是说,你打算生成一些合法的 HTML 代码)
<a href></a>
,而不仅仅是普通的文本。 - 你创建了一个包含一张表单的应用程序,这个应用程序负责搜集包含电子邮件地址在内的用户信息。你需要检查用户给出的电子邮件地址是否符合正确的语法格式。
- 你正在编辑一段源代码并且要把所有的
size
都替换为isize
,但这种替换仅限于单词size
本身,并不涉及那些包含字符串size
的其他单词。 - 你正在显示一份计算机文件系统中所有文件的清单,但你只想把文件名包含
Application
字样的文件列举出来。 - 你正在把一些数据导入应用程序。那些数据以制表符作为分隔符,但你的应用程序要支持
CSV
格式(每条记录独占一行,同一条记录里的各项数据之间用逗号分隔,数据允许出现在引号内)。 - 你需要在文本里搜索某个特定的文本,但你只想把出现在特定位置(比如每行的开头或每条语句的结尾)的文本找出来。
以上场景是大家在编写程序时经常会遇到的问题,用任何一种支持条件处理和字符串操作的编程语言都可以解决,但问题是这种解决方案会变得十分复杂。另一种解决方案是只用正则表达式,上述问题都可以用一些精心构造的语句,或者说一些由文本和特殊指令构成的高度简练的字符串来解决,比如像下面这样的语句:
b[Cc][Aa][Rr]\b
如何使用正则表达式
认真思考上述的问题场景,就会发现它们不外乎两种情况:一种是查找特定的信息(搜索),另一种是查找并编辑特定的信息(替换)。从根本上讲,这正是正则表达式的两种基本用途:搜索和替换。
(1) 正则表达式的主要用途之一是搜索变化多端的文本,比如刚才描述的搜索单词car
的场景:你要把car
, CAR
, CaR
都找出来,并确保scar, carry, incarcerate之类的单词不会被匹配。
(2) 正则表达式的另一个强大功能就是替换操作,比如我们刚才描述的把URL地址字符串替为可点击URL地址的场景:这需要先把相关文本里的 URL 地址字符串找出来(比如:通过搜索 http://
或https://
开头并以句号、逗号或空白字符结尾的字符串),再把找到的URL地址字符串替换为HTML的<a href=...>...</a>
元素,如下所示:
https://geek-docs.com/
替换成:
<a href="http://geek-docs.com">https://geek-docs.com/</a>
正则表达式的使用方式和具体功能在不同的应用程序语言中各不相同,一般来说,应用程序大多通过菜单选项和对话框来使用正则表达式,而程序设计语言大都通过函数、类或对象提供正则表达式功能。比如 Python 使用正则表达式的方法如下:
pythong 通过re
模块提供了正则表达式支持,支持如下函数:
- preg_grep(): 执行搜索并以数值形式返回匹配结果
- findall(): 查找所有子串并以列表形式将其返回。
- finditer(): 查找所有子串并以迭代器形式将其返回。
- match(): 在字符串的开头执行正则表达式搜索。
- search(): 搜索字符串中的所有匹配项。
- split(): 将字符串转换成列表,在模式匹配的地方将其分隔。
- sub(): 用指定的子串替换匹配项。
- subn(): 返回一个字符串,其中匹配项被指定的子串替换。