首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

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提示。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论