- JavaScript从入门到精通(第3版)
- 明日科技
- 2605字
- 2021-03-26 09:55:39
7.3 RegExp对象
在JavaScript中,正则表达式是由RegExp对象表示的。利用RegExp对象可以完成有关正则表达式的操作和功能。
7.3.1 创建RegExp对象
每个正则表达式模式都对应一个RegExp实例。有两种方式可以创建RegExp对象的实例,下面分别进行介绍。
(1)使用RegExp的显式构造函数
语法格式:
new RegExp("pattern"[,"flags"]) //即new RegExp(" 模式 "[," 标记 "])
(2)使用RegExp的隐式构造函数,采用纯文本格式
语法格式:
/pattern/[flags]
Pattern参数为要使用的正则表达式模式文本,是必选项。在第一种方式中,pattern部分以JavaScript字符串的形式存在,需要使用双引号或单引号括起来;在第二种方式中,pattern部分嵌套在两个“/”之间,不能使用引号。
Flags参数用于设置正则表达式的标志信息,是可选项。如果设置flags部分,在第一种方式中,以字符串的形式存在;在第二种方式中,以文本的形式紧接在最后一个“/”字符之后。flags可以是以下标志字符的组合。
g是全局标志。如果设置了这个标志,对某个文本执行搜索和替换操作时,将对文本中所有匹配的部分起作用。如果不设置这个标志,则仅搜索和替换最早匹配的内容。
i是忽略大小写标志。如果设置了这个标志,进行匹配比较时,将忽略大小写。
m是多行标志。如果未设置多行标志,那么元字符“^”只与整个被搜索字符串的开始位置相匹配,元字符“$”只与被搜索字符串的结束位置相匹配。如果设置了多行标志,“^”还可以与被搜索字符串中的“\n”或“\r”之后的位置(即下一行的行首)相匹配,“$”还可以与被搜索字符串中的“\n”或“\r”之后的位置(即下一行的行尾)相匹配。
注意
文本格式中的参数不要使用引号标记,构造器函数的参数要使用引号标记。所以,下面两个表达式建立的是同样的正则表达式。
/ab+c/i new RegExp("ab+c","i")
当使用构造函数时,使用正常的字符串避开规则(在字符串中加入前导字符“\”)是必需的。例如,下面的两条语句是等价的:
re = new RegExp("\\w+") re = /\w+/
【例7.6】 创建正则表达式。(实例位置:资源包\TM\sl\7\06)
运行结果如图7.6所示。
图7.6 创建正则表达式
代码如下:
由于JavaScript字符串中“\”是一个转义字符,因此,使用显式构造函数创建RegExp实例对象时,应将原始正则表达式中的“\”用“\\”替换,例如:
运行结果:
re1=/\d{2}/ re2=/\d{2}/
由于正则表达式模式文本中的转义字符也是“\”,因此,如果正则表达式中要匹配原义字符“\”,在正则表达式模式文本中要以“\\”来表示;当使用显式构造函数的方式创建RegExp实例对象时,就需要使用“\\\\”来表示原义字符“\”,例如:
var re = new RegExp("\\\\")
7.3.2 RegExp对象的属性
RegExp对象的属性分为静态属性和实例属性,下面分别进行介绍。
1.静态属性
RegExp对象的静态属性包括index、input、lastIndex、lastMatch、lastParen、leftContext、rightContext以及$1…$9。
index属性:是当前表达式模式首次匹配内容的开始位置,从0开始计数。其初始值为-1,每次成功匹配时,index属性都会随之改变。
input属性:返回当前所作用的字符串,可以简写为$_,初始值为空字符串("")。
lastIndex属性:当前表达式模式首次匹配内容中最后一个字符的下一个位置。从0开始计数,常被作为继续搜索时的起始位置。初始值为-1,表示从起始位置开始搜索。每次成功匹配时,lastIndex属性值都会随之改变。
lastMatch属性:当前表达式模式的最后一个匹配字符串,可以简写为$&。其初始值为空字符串("")。每次成功匹配时,lastMatch属性值都会随之改变。
lastParen属性:如果表达式模式中有括起来的子匹配,是当前表达式模式中最后的子匹配所匹配到的子字符串,可以简写为$+。其初始值为空字符串("")。每次成功匹配时,lastParen属性值都会随之改变。
leftContext属性:当前表达式模式最后一个匹配字符串左边的所有内容,可以简写为$`(其中“`”为键盘上Esc键下边的反单引号)。初始值为空字符串("")。每次成功匹配时,其属性值都会随之改变。
rightContext属性:当前表达式模式最后一个匹配字符串右边的所有内容,可以简写为$’。初始值为空字符串("")。每次成功匹配时,其属性值都会随之改变。
$1…$9属性:这些属性是只读的。如果表达式模式中有括起来的子匹配,$1…$9属性值分别是第1~9个子匹配所捕获到的内容。如果有超过9个以上的子匹配,$1…$9属性分别对应最后的9个子匹配。在一个表达式模式中,可以指定任意多个带括号的子匹配,但RegExp对象只能存储最后9个子匹配的结果。在RegExp实例对象一些方法返回的结果数组中,可以获得所有圆括号内的子匹配结果。
2.实例属性
RegExp的实例有几个只读的属性,其中global表示是否为全局匹配,ignoreCase表示是否忽略大小写,multiline表示是否为多行匹配,source是正则式的源文本,如“/[ab]/g”的源文本就是“[ab]”。另外,还有一个可写的属性是lastIndex,表示下次执行匹配时的起始位置。下面对这几种属性进行详细说明。
global属性:返回创建RegExp对象实例时指定的global标志(g)的状态。如果创建RegExp对象实例时设置了g标志,该属性返回true,否则返回false,默认值为false。
ignoreCase属性:返回创建RegExp对象实例时指定的ignoreCase标志(i)的状态。如果创建RegExp对象实例时设置了i标志,该属性返回true,否则返回false,默认值为false。
multiline属性:返回创建RegExp对象实例时指定的multiline标志(m)的状态。如果创建RegExp对象实例时设置了m标志,该属性返回true,否则返回false,默认值为false。
source属性:返回创建RegExp对象实例时指定的表达式文本字符串。
7.3.3 RegExp对象的方法
1.exec()方法
exec()方法用正则表达式模式在字符串中进行查找,并返回包含该查找结果的一个数组。
语法格式:
rgExp.exec(str)
参数说明:
rgExp:必选项,包含正则表达式模式和可用标志的正则表达式对象。
str:必选项,要在其中执行查找的String对象或字符串文字。
如果exec()方法没有找到匹配,则返回null;如果找到匹配,则返回一个数组,并更新全局RegExp对象的属性,以反映匹配结果。数组的0元素包含了完整的匹配,而第1~n元素中包含的是匹配中出现的任意一个子匹配。这相当于没有设置全局标志(g)的match()方法。
如果为正则表达式设置了全局标志,exec()方法将从lastIndex值指示的位置开始查找;如果没有设置全局标志,exec()方法将忽略lastIndex的值,从字符串的起始位置开始搜索。
exec()方法返回的数组有两个属性,分别是input和index。input属性包含了整个被查找的字符串,index属性包含了整个被查找字符串中符合匹配的子字符串的位置。
例如,下面应用exec()方法来返回一个数组,代码如下:
运行结果:
0-1I 2-3m 4-5a 6-10good 11-14boy
2.test()方法
test()方法返回一个Boolean值,指出在被查找的字符串中是否存在模式。
语法格式:
rgexp.test(str)
参数说明:
rgexp:必选项,表示包含正则表达式模式或可用标志的正则表达式对象。
str:必选项,表示要在其上测试查找的字符串。
说明
test()方法用于检查字符串中是否存在某个模式,如果存在则返回true,否则返回false。test()方法不修改全局RegExp对象的属性。
例如,下面应用test()方法查询指定字符串是否存在,代码如下:
函数调用语句:
document.write (TestDemo(/boy+/ ,"I am a good boy !"));
运行结果:
'I am a good boy !' contains 'boy+'