14.3 RegExp对象
在JavaScript中,正则表达式由RegExp对象引入,每一个正则表达式都是一个RegExp对象的实例。同时正则表达式可调用RegExp对象的方法进行相关操作,并将操作的结果保存在RegExp对象实例的属性中。要深入理解正则表达式,必须全面掌握RegExp对象的相关知识。
14.3.1 RegExp对象的创建
在JavaScript中,正则表达式的构造可以有两种方法,其语法如下所示:
采用RegExp对象的显式构造函数构造:
var regularexpression = new RegExp("pattern",["flags"]);
采用RegExp对象的隐式构造函数构造:
var regularexpression = /pattern/[flags] ;
显式构造方法直接调用RegExp对象的构造函数RegExp()来构造,这也是面向对象语言(OPP)中创建对象常用的方法。而隐式构造方法是JavaScript 1.2中新添加的一个特殊语法,用于隐式创建RegExp对象的实例,相当于字符串直接被定义为包含在正反双引号内的字符数组一样,正则表达式直接量也被定义为包含在一对斜杠“/”之间的字符数组。
其中,regularexpression为待定义的RegExp对象实例名,可通过该实例名直接引用该正则表达式;参数pattern为待使用的正则表达式模式文本,是必选项。在显式构造方法中,pattern部分以JavaScript字符串的形式存在,需要使用双引号(或单引号)括起来;在隐式构造方法中,参数pattern嵌套在两个“/”之间,不需要使用引号。
可选参数flags为正则表达式的标志信息。可供选择的值有:“i”、“g”和“m”,其作用归纳如表14.1所示。
表14.1 flags标志信息项:“I”、“g”和“m”
|
参 数 |
功能与作用 |
|
i |
忽略大小写标志。如果设置了该标志,在进行字符串匹配时,将忽略大小写 |
|
g |
表示在全文中查找出现的所有pattern。如果设置了该标志,对某个文本执行搜索和替换操作时,将对文本中所有匹配的部分起作用;如果不设置该标志,则仅搜索和替换最先匹配的部分 |
|
m |
多行标志。该标志的设置与否,会直接影响到定位符(^和$)的使用效果。定位符的相关内容将在后续章节进行详细的叙述 |
flags也可以是上述选项的组合,如ig,表示在全局范围搜索并忽略大小写。
在源程序14.1中已经了解如何创建RegExp对象的实例,其结构如下所示:
var myregex = new RegExp("abc"); // 显式创建正则表达式
上述方法为显式构造法,等价地,使用隐式构造法代码如下所示:
var myregex = /abc/; // 隐式创建正则表达式
同时也可以加一些标志信息选项,如在显示构造中加入忽略大小写,表示如下:
var myregex = new RegExp("abc",”i”); // 显示创建正则表达式,并忽略大小写
在隐式构造中,可以加入全文搜索并且忽略大小写标志信息,表示如下:
var myregex = /abc/ig; // 隐式创建正则表达式,并全文忽略大小写
读者可以根据源程序14.1,自行修改对应的代码,分别使用两种构造方法并观察有何异同点。
再来介绍一下“子匹配”的概念,子匹配即是正则表达式语法中的分组概念。在正则表达式中用括号“()”把一些字符串括起来表示一个子匹配,并按括号出现的顺序进行编号,同时在字符串匹配时把子匹配结果存储在缓冲区,并作为查询的结果返回。例如正则表达式“/(ab)c/”中的“(ab)”就是一个子匹配,表达式在搜索的时候不仅记录整个表达式的匹配结果,还把子匹配“ab”记录在缓冲区,以供查询。
注意:RegExp对象实例两种构造方式效果是一样的,但还是有小的差别。隐式构造在脚本执行时进行编译,当经常用到这个正则表达式时,使用隐式构造法性能较好。而显式构造法遇到正则表达式时才进行编译,所以在正则表达式使用较少的情况下选择该方法。
RegExp对象使用其属性来保存使用正则表达式进行模式匹配的结果,从而可通过查找其属性值的变化来获取模式匹配的信息。RegExp对象的属性可分为实例属性和静态属性。下面分别介绍这两种属性。
14.3.2
实例属性
RegExp对象的实例属性指在查找前后属性值没有发生改变的属性,一旦表达式确立,其属性值也确定。常见的实例属性如表14.2所示。
表14.2 RegExp对象实例属性
|
属 性 |
描 述 |
|
global |
返回global标志(g)的状态。如果创建RegExp对象实例时设置了g标志,该属性返回true,否则返回false,默认值为false |
|
ignoreCase |
返回ignoreCase标志(i)的状态。如果创建RegExp对象实例时设置了i标志,该属性返回true,否则返回false,默认值为false |
|
multiLine |
返回multiLine标志(m)的状态。如果创建RegExp对象实例时设置了m标志,该属性返回true,否则返回false,默认值为false |
|
source |
返回创建RegExp对象实例时指定的表达式文本字符串,即pattern值 |
14.3.3
静态属性
RegExp对象的静态属性是指查找前后属性值可能变化的属性。常见的静态属性如表14.3所示。
表14.3 RegExp对象的静态属性
|
属 性 |
简 写 |
初 始 值 |
描 述 |
|
index |
|
-1 |
返回第一个成功匹配的字符串的开始位置。每次成功匹配时,index属性都会随之改变 |
|
lastIndex |
|
-1 |
查找到的第一个匹配字符后的位置,如成功匹配room中的oo,则lastIndex指向m。每次成功匹配时,lastIndex属性值都会随之改变 |
|
input |
$_ |
null |
返回执行查找的字符串,即查找的源。为只读属性 |
|
leftContext |
$` |
null |
是当前表达式模式最后一个匹配字符串左边的所有内容。每次成功匹配时,其属性值都会随之改变 |
|
rightContext |
$’ |
null |
是当前表达式模式最后一个匹配字符串右边的所有内容。每次成功匹配时,其属性值都会随之改变 |
|
lastMatch |
$& |
null |
是当前表达式模式的最后一个匹配字符串。在每次成功匹配时,lastMatch属性值都会随之改变 |
|
lastParen |
$+ |
null |
如果表达式模式中有括起来的子匹配,是当前表达式模式中最后的子匹配所匹配到的子字符串。每次成功匹配时,lastParen属性值都会随之改变 |
|
$1-$9 |
$1-$9 |
null |
返回九个在模式匹配期间找到的、最近保存的部分。属性为只读。 如果表达式模式中有括起来的子匹配,$1…$9属性值分别是第1个到第9个子匹配所捕获到的内容。如果有超过9个以上的子匹配,$1…$9属性分别对应最后的9个子匹配。在后面介绍的操作方法中,可以通过相关方法获得所有的子匹配结果 |
注意:表14.3中的null表示空字符串;且表中除了index和lastIndex外,其余属性都有简写,在脚本中可使用简写表示其对应属性。
14.3.4
属性应用实例
在正则表达式查找前后,实例属性值不变,而静态属性值则会有一个明显的变化。考察源程序14.2。
//源程序14.2
<!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.0//EN"
"http://www.w3.org/TR/REC-html140/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>Sample Page!</title>
<script language="JavaScript" type="text/javascript">
<!--
//获取对象相关信息
function RegexpDemo()
{
var myString="在正则表达式查找前后,实例属性值不变,而静态属性值则会有明显的变化";
//隐式构造法创建正则表达式对象
var regex = /属性/;
//exec()方法
var array=regex.exec(myString);
if(array)
{
var msg="\n获取RegExp对象的属性 : \n\n";
msg+="搜索结果 :\n";
msg+="目标字符串 :"+array.input+"\n";
msg+="找到目标子串 : "+regex.source+"\n";
msg+="regex.global : "+regex.global+"\n";
msg+="返回数组的值 : "+array+"\n";
msg+="数组长度信息array.length : "+array.length+"\n";
msg+="匹配子串起始位置array.index : "+array.index+"\n";
msg+="匹配子串后第一个字符的位置array.lastIndex : "+array.lastIndex+"\n";
msg+="RegExp.lastParen : "+RegExp.lastParen+"\n";
msg+="RegExp.$1 : "+RegExp.$1+"\n";
msg+="数组长度array.length : "+array.length+"\n";
alert(msg);
}
else
{
alert("在目标字符串中未找到匹配子串!");
}
}
-->
</script>
</head>
<body>
<center>
<p>
获取验证RegExp对象的属性:
</p>
<form onSubmit="return RegexpDemo();">
<input type="submit" value="确定">
</form>
</center>
</body>
</html>
程序运行后,单击页面中的“确定”按钮,弹出警告框如图14.4所示。

图14.4 属性测试程序运行结果
上述程序运行结果分析如下。
global属性为false,即没有设置global属性。
array数组元素长度为1;RegExp.index和array.index 均为13;RegExp.lastIndex和array.lastIndex均为15,可见index和lastIndex这两个属性用RegExp或array引用结果是一样的。
RegExp.lastParen和$1两个属性均为空。
为了便于比较,下面在表达式中设置子匹配并加上global属性,将下面的语句:
var regex = /属性/; //隐式构造法创建正则表达式对象
修改为:
var regex = /(属性)/g; //隐式构造法创建正则表达式对象,设置子匹配和标志g
保存文件并使用浏览器重新载入该文档,在原始页面中单击“确定”按钮后,弹出警告框如图14.5所示。

图14.5 属性验证程序修改后运行结果
比较两次运行结果:global属性设置为true;array数组长度为2(除匹配结果外还包含子匹配结果);RegExp.index和array.index、RegExp.lastIndex和array.lastIndex没有变化。RegExp.lastParen 和 $1不再为空,已经变为子串“属性”。
注意:index、lastIndex、input等属性可以用RegExp对象引用,也可以用返回结果数组array直接引用,甚至可用RegExp对象的实例regex引用,如对index引用可表示为RegExp.index、array.index或者regex.index;global、source 等实例属性只能用RegExp对象的实例regex引用;lastParen、lastMatch等只能用RegExp对象引用。如果引用方式出错,将出现Undefined提示。






