14.2.2 构建一个正则表达式

尽管一个正杂表达式经常由一个单词或几个单词构成,更常见的是,使用字母和特殊字符的组合来定义想要匹配的模式。正则表达式提供了不同的符号来表示不同类型的字符。例如,一个单个的句点(.)表示一个单个的字符,任意字符,而\w匹配任意字母或数字(但是不匹配空格,或者类似$或%的符号)。表14-1提供了大多数常见的模式匹配字符的一个列表。

注意:如果对于“正则”表达式的所有讨论会让你头疼,你可能会很高兴地获知,本书提供了一些有用的正则表达式(参见14.2.4节),你可以在自己的脚本中复制和使用它们(而不需要真的知道它们是如何工作的)。

14.2.2 构建一个正则表达式 - 图1

14.2.2 构建一个正则表达式 - 图2

学习正则表达式,通过示例来解释更容易一些,因此,本节剩下的部分将带领你来看一些正则表达式的示例,以帮助你完全理解这一主题。假设你想要匹配连续的5个数字,可能要检查字符串中是否有一个U.S.Zip代码。

1.匹配一个数字。

第一步是直接搞清楚如何匹配一个数字。如果你参考表14-1,将会看到,有一个专门的正则表达式符号用于这个目的,这就是\d,它匹配任何单个的数字。

2.匹配连续的5个数字。

由于\d匹配单个的数字,匹配5个数字的一种简单方式是,使用正则表达式\d\d\d\d\d(参见14.2.3节,那里介绍了编写这种代码的更紧凑的方式)。

3.仅匹配5个字母。

正则表达式就像是一颗精确制导的导弹:它将目标设置为所匹配的字符串的第一部分。因此,有时候,我们得到的匹配只是一个完整单词或一组字符的一部分。这个正则表达式匹配所遇到的前5个连续的字母。例如,它将匹配数字12345678998中的12345。显然,12345678998不是邮政编码,因此,你需要仅仅以5个数字为目标的而一个正则表达式。

\b字符(叫做单词分界字符)匹配任何非字母或非数字的字符,因此我们可以重新编写自己的正则表达式如下:\b\d\d\d\d\d\b。我们也可以使用^字符来匹配一个字符串的开始,并且使用$来匹配一个字符串的结尾。如果想要整个字符串匹配你的正则表达式,这种技巧很方便。例如,如果某人在一个订购表单的邮政编码字段中输入“kjasdflkjsdf 88888 lksadflkjsdkfjl”,你可能想要让访问者在订购之前搞清楚(并修正)其邮政编码。毕竟,我们确实在查找类似97213的内容(字符串中没有其他字符)。在这个例子中,正则表达式将会是^\d\d\d\d\d$。

注意:邮政编码可以有5个以上的数字。ZIP+4格式在前5个数字之后,包含一个斜杠和4个额外的数字,例如,97213-1234。要了解处理这种可能性的正则表达式,查看14.2.4节。

4.将正则表达式用于JavaScript中假设你已经将用户的输入捕获到一个名为zip的变量中,并且想要进行测试,看看表单中的输入是否是一个有效的5个数字的邮政编码:


var zipTest=/^\d\d\d\d\d$/;//create regex

if(zip.search(zipTest)==-1){

alert('This is not a valid zip code');

}else{

//is valid format

}


这些步骤中的正则表达式示例是有效的,但是,它似乎需要太多工作,要输入\d五次之多。如果想要匹配连续的100个数字,该怎么办呢?幸运的是,JavaScript带有几个符号,可以匹配同一字符的多次出现。表14-2包含了这些符号的一个列表。你可以将这些符号直接放在想要匹配的字符的后面。

例如,要匹配5个数字,可以编写\d{5}。\d匹配一个数字,随后,{5}告诉JavaScript解释器,匹配5个数字。因此,\d{100}将匹配连续的100个数字。

让我们来看另一个例子。假设你想要从字符串中找到任何GIF文件的名称。此外,你想要确切的文件名,并且可能以某种方式在脚本中使用(例如,你可以使用14.2.5节介绍的match()方法)。换句话说,你想要找到与一个GIF文件名的基本模式匹配的任何字符串,例如,logo.gif、banner.gif或ad.gif。

1.识别这些名称之间的常用模式。

要构建一个正则表达式,首先需要知道要查找的字符是什么模式。在这里,由于要查找GIF,我们知道,其文件名将以.gif结尾。换句话说,在.gif之前,可能有任意多个字母、数字或其他字符。

2.查找.gif。

由于我们要查找字面字符串’.gif',你可能会想,正则表达式的这个部分应该只是.gif。然而,如果你查看一下表14-1,将会看到,一个点号具有特殊的含义,表示“匹配任何字符串”。因此,.gif将会匹配“.gif”,但是,它也会匹配“tgif”。一个句点匹配任意单个的字符,因此,除了匹配一个句点,它还匹配tgif中的“t”。要创建带有一个句点的正则表达式,可在其前面添加一个反斜杠,因此,.解释为“找出句点符号”。因此,该正则表达式将会查找.gif而不是.gif。

3.找到.gif之前的任意多个字符。

要找到任意多个字符,我们可以使用.,它解释为“找到一个字符(.)0次或多次()”。这个正则表达式匹配任何字符串中的所有字母。然而,如果你使用它创建..gif这样的一个正则表达式,你最终匹配的将不只是一个文件名。例如,如果有一个字符串'the file is logo.gif',那么,正则表达式..gif将匹配整个字符串,而你实际想要的只是logo.gif。要做到这一点,使用\S字符,它匹配任何的非空格字符:\S*.gif将只匹配该字符串中的logo.gif。

4.让搜索不区分大小写。

这个正则表达式中还有一个问题:它只查找以.gif结尾的文件,但是,.GIF也是有效的文件扩展名,因此,这个正则表达式不会选出类似logo.GIF的一个名称。要让一个正则表达式忽略大写字母和小写字母之间的区别,创建一个正则表达式的时候,我们使用i参数:


/\S*. gif/i


注意,i放在模式之外,并且放在定义正则表达式模式的结尾的/符号的右边。

5.付诸应用:


var testString='The file is logo.gif';//the string to test

var gifRegex=/\S*.gif/i;//the regular expression

var results=testString.match(gifRegex);

var file=results[0];//logo.gif


这段代码会从字符串提取出该文件名(我们将在14.2.5节学习match()方法是如何工作的)。