14.2 在字符串中查找模式

有时候,我们想要搜索一个字符串,但不是针对一个具体的值,而是针对一种特定模式的字符。例如,当一个访问者填写一个订货表单的时候,我们想要确保他以正确的格式提供了一个电话号码。我们实际上不是要查找类似503-555-0212的一个具体号码。相反,我们要查找一种通用的模式:3个数字,一个连字符,3个数字,另一个连字符,然后是4个数字。你想要检查访问者输入的值,如果它匹配这个模式(例如,它是415-555-3843、408-555-3782或者212-555-4828等),那么,一切正常。但是,如果它不匹配该模式(例如,访问者输入了823lkjxdfglkj),那么,你可能要显示类似“Hey buddy, don't try to fool us!”的一条消息。

JavaScript允许你使用正则表达式在一个字符串中查找模式。正则表达式是一系列的字符,它定义了你想要搜索的一种模式。和很多编程术语一样,正则表达式的名字也有一点误导。例如,下面是一个常见的正则表达式的样子:


/^[-\w.]+@([a-zA-Z0-9][-a-zA-Z0-9]+.)+[a-zA-Z]{2,4}$/


除非你是超级外星人,否则,从正则表达式看不出什么非常有规则的内容。要创建一个模式,可以使用类似*、+、?和\w的字符,它们经过JavaScript解释器的翻译,可以匹配字符串中真正的字符,如字母、数字等。

注意:专业人士常常将正则表达式简称为regex。

14.2.1 创建和使用基本的正则表达式

要在JavaScript中创建正则表达式,必须创建一个正则表达式对象,它是两个斜杠之间的一系列字符。例如,要创建于单词“hello”匹配的一个正则表达式,你可以输入如下内容:


var myMatch=/hello/;


就像一个开始引号和一个结束引号创建一个字符串一样,开始/和结束/创建了一个正则表达式。

JavaScript还有几个字符串方法,它们充分利用了正则表达式的优点(我们将从14.2.5节开始学习它),但是,最为基本的方法就是search()方法。它的工作方式和indexOf()方法很像,但是,它在一个字符串中搜索一个模式(一个正则表达式),而不是试图在一个较大的字符串中搜索一个字符串。例如,假设你想要在字符串'To be or not to be.’找到'To be'。你在14.1.3节看到了如何使用indexOf()方法做到这一点,这里将介绍如何使用正则表达式做到这一点:


var myRegEx=/To be/;//no quotes around regular expression

var quote='To be or not to be.’;

var foundPosition=quote.search(myRegEx);//returns 0


如果search()方法找到一个匹配,它返回了匹配的第一个字母的位置,并且,如果它没有找到一个匹配,它返回-1。因此,在上面的例子中,变量foundPosition是0,因为,'To be'从字符串非常靠前(第一个字母)的地方开始。

正如我们在14.1.3节介绍过的,indexOf()方法以同样的方式工作。你可能会想,如果两个方法是相同的,为什么还要这么麻烦地使用正则表达式?正则表达式的好处是,它们可以在字符串中找到模式,因此,它们能够进行比indexOf()方法更为复杂和微妙的比较,而后者总是查找和一个具体字符串的匹配。例如,如果要查找一个字符串是否包括Web地址http://www.missingmanuals.com/,可以使用indexOf()方法,但是,要查找与URL的格式匹配的任何文本,例如,当验证某个人在你的博客上发表评论的时候是否提供了一个Web地址,那么,必须使用正则表达式。

然而,要掌握正则表达式,你需要学习构造一个正则表达式所必需的、经常令人混淆的符号。