[跟我学正则表达式] 1. 介绍
在本章中你将学习到什么是正则表达式以及可以做什么事情。
?
理解需求
正则表达式(Regular Expression,regex)是一个工具。向所有其他工具一样,正则表达式是用来解决一类特定问题的。理解正则表达式以及其可以做什么的最好方式就是理解它们可以解决什么问题。
考虑下面的一些场景:
这里的场景都给出了一个特定的编程问题。只要是支持条件控制和字符串处理的语言都可以解决这些问题。但是这里的问题解决起来是多么的复杂?需要循环到每个字符,执行所有的if语句,跟踪大量的标志来决定哪些已经找到哪些没有找到,检查空格和其他特殊字符等等。而这些都必须自己手工完成。
或者你可以使用正则表达式。上面的所有问题都可以通过一个特殊设计的语句来解决。这是一个非常精炼的字符串,包含有文本和一些特殊的指示符,就像下面一样:
\b[Cc][Aa][Rr]\b
如果对于上面的这行没有感觉的话,没有关系,马上就会有了。
?
正则表达式的使用方法
再看看上面的场景,发现这些问题可以分为两类:找到特定的信息(搜索)或者找到特定的信息并修改(替换)。事实上,这就是正则表达式可以完成的功能:搜索和替换。每个正则表达式要么匹配文本(执行搜索),要么匹配文本并替换(执行替换)。
?
RegEx 查找
正则表达式适合用于搜索动态的文本数据,就像前面搜索car的场景一样。你可能需要找到car、CAR 、Car 甚至是CaR,这个部分很简单(很多的搜索工具都可以不区分大小查找文本)。麻烦的部分在于不要匹配上scar, carry和incarcerate。有些高级的编辑器有着“匹配整个单词”的选秀,但是许多并没有,使得你可能不会对你正在编辑的文档做修改。使用正则表达式的搜索功能,找到car单词,就可以解决此问题。
提示:
想知道这个问题的答案吗?其实你已经看到过了——就是你在前面见到过的示例代码:\b[Cc][Aa][Rr]\b。
在查找的时候没有必要检查其相等性(例如判断用户输入的Email地址是否匹配正则表达式?)。用户的整个输入都会被搜索(对比子串查找,这是很多搜索中常用的)。
?
RegEx 替换
正则表达式查找非常的强大和游泳,而且并不是那么难学习。事实上,许多的教程和例子都只是查找。但是,正则表达式的强大威力则在于其替换,就像前面场景中出现的将URL转换为可点击的URL一样。首先需要在文本中定位到URL的位置(可能通过搜索http://或者https://开头而以句号、逗号或者是空格结束的字符串)。然后需要将找到的URL替换为嵌入在HTML中的两个字符串。如
http://www.forta.com/需要替换为<A HREF="http://www.forta.com">http://www.forta.com/</A>。
许多应用中的“查找和替换”选项并不能处理这里的替换操作,但是这里使用正则表达式却是如此的简单。
?
那到底什么是正则表达式?
现在你已经知道正则表达式的用途了,现在是其定义了。简单地说,正则表达式是可以用来匹配和修改文本的字符串。可以使用正则表达式语言来创建正则表达式,这是一个用来完成以前工作的特殊语法语言。就像所有其他语言一样,正则表达式语言也有着特殊的语法和指示符。这也是本书要告诉你的。正则表达式语言并不是一个完整的编程语言。它甚至不是一个可以安装使用的语言或者工具。幸运的是,现在的大部分语言和工具都支持正则表达式语言。而不幸的消息则是这些语言和工具所支持的正则表达式语言并不是相同的。同时,正则表达式语言并不直观,难以直接看懂。
正则表达式发明于1950年代的数学领域研究。不久后,这个早期工作的思想和规则就被引入到Unix世界引入到Perl语言以及其他如grep的小工具中。在很长的时间里,正则表达式(前面介绍过可以使用的场景)被排除在Unix团体以外,但是现在这个状况已经改变,正则表达式几乎在所有的计算平台上都得到了支持。
为了有个直观概念,下面的都是合法的正则表达式(稍后将会对其感兴趣):
需要提及的是语法是掌握正则表达式中最容易的部分。真正的挑战将是学习如何应用这些语法、如何将问题分解成可以解决的正则表达式问题。这好像并不是看一本书能够学会的,而是像其他语言一样,需要大量的练习。
?
使用正则表达式
在前面解释过,并没有什么正则表达式程序。它并不是你能够运行的程序,也不是你可以购买或者下载的软件。但是,正则表达式语言被实现在许多软件产品、语言、工具和开发环境中。
正则表达式的使用范围和以及其功能的使用对于各个应用程序来说差别是很大的。有些应用使用菜单选项和电话看来访问正则表达式,不同的编程语言则提供了不同的类或者函数用来显示正则表达式的功能。
另外,并不是所有的正则表达式实现是一样的。在不同的语法和特性中总是存在着一些微小的差别(当然有些时候并不微小)。
附录A:流行应用和语言中的正则表达式,提供了支持正则表达式的应用和工具的详细使用情况。在进行到下一章之前,可以翻到这个附录看看你将要使用的应用或者是语言的语法。
为了能够帮助你更快的入门,你可以从本书的Web页面上http://www.forta.com/books/0672325667/下载一个正则表达式测试应用。这个应用是基于Web的,这里有使用流行应用服务器和语言的版本,包括直观的JavaScript。这个应用在附录C中介绍:正则表达式测试器。在测试正则表达式的时候使用是非常方便和很有好处的。
?
在开始之前
在继续学习正则表达式之前,注意下面的几点:
我建议你尝试本书中的每个正则表达式代码。
?
小结
正则表达式是文本处理的最强大工具之一。正则表达式语言用来创建正则表达式(最后构造出来的字符串称为正则表达式),同时正则表达式可以用来执行查找和替换操作。