JavaScript 用于模式匹配的 RegExp 方法

本篇日志先主要讨论 RegExp 对象的部分方法,RegExp 对象定义了两个用于模式匹配的方法,它们是exec()test() 下面我们逐一进行讲解 。呵,和上篇日志一样的介绍,看来套话,果然适用于多个场合。嗯。

exec() 检索字符串中的指定值,返回值是被找到的值,如果没有发现匹配,则返回 null:

主要的RegExp模式匹配方法是exec(),其与上一篇介绍的String对象的match方法相似,只不过它是以字符串为参数的RegExp方法,而不是以RegExp对象为参数的字符串方法。呼,这一句有点像绕口令,没办法,书上的原话,抄过来让大家乐一乐,呵。exec()方法在一个字符串中检索匹配,如果没有找到任何匹配返回null,如果它找到了一个匹配,将返回一个数组。

就像方法match()为非全局检索返回的数组一样。这个数组的元素0包含的是与正则表达式相匹配的字符串,余下的所有元素包含的是与子表达式相匹配的子串,而且属性index包含了匹配发生的字符的位置,属性input引用的是被检索的字符串。

/*
i is 0  http://www.xiaoxiaozi.com/index.php
i is 1  http
i is 2  www.xiaoxiaozi.com
i is 3  index.php
i is index  11
i is input  my home is http://www.xiaoxiaozi.com/index.php
*/

var str = 'my home is http://www.xiaoxiaozi.com/index.php' ;
var pattern = /(/w+):////([/w.]+)//(/S*)/ ;
//var result = str.match(pattern);
var result = pattern.exec ( str) ;
for ( i in result)
{
        document.write ( "i is " + i+ "&nbsp;&nbsp;" + result[ i] + "<br/>" ) ;
}

与match()方法不同的是,exec()返回的数组类型不同,无论该正则表达式是否含有全局属性g。因为当含有全局属性g的时 候,match()方法返回的是一个匹配的数组,而调用exec()方法的RegExp有一个lastIndex属性,它将把该对象的lastIndex 属性设置到紧接着匹配子串的字符位置。

当同一个RegExp对象第二次调用exec()时,它将从lastIndex属性所指示的字符处开始检索,如果exec()没有发现任何匹配,它 会将lastIndex属性重围为0,(在任何时候你都可以将lastIndex属性设为0,每当你在一个字符串中找到最后一个匹配之前就开始用同一个 RegExp对象来检索另一个字符串,而放弃了原来的检索的时候就方法应该这样做)。这一特殊的行为使得你可以反复调用exec()遍历一个字符串中所有 的正则表达式匹配。

/*
Matched 'Java' at position 0 ; next search begins at 4
Matched 'Java' at position 28 ; next search begins at 32
*/

var pattern = /Java/g ;
var text = "JavaScript is more fun than Java!" ;
var result;
while ( ( result = pattern.exec ( text) ) != null )
{
        document.write ( "Matched '" + result[ 0 ] + "'" +
                " at position " + result.index +
                " ; next search begins at " + pattern.lastIndex + "<br/>" ) ;
}

test() 检索字符串中的指定值,返回值是 true 或 false:

这个方法就要简单的多了,也是我平时用的最多的一个方法,它的作用就是检查字符串中是否包含正则表达式的一个匹配。如果包含,则返回true,否则就返回false。

当一个全局正则表达式调用test()时,它的行为和方法exec()相同,即它从lastIndex指定的位置处开始检索特定的字符串,如果它发 现了匹配,就将lastIndex设置为紧接在那个匹配之后的字符的位置。这样我们也可以使用方法test()来遍历字符串,就像用exec()方法一 样。

/*
next search begins at 4
next search begins at 32
*/

var pattern = /Java/g ;
var text = "JavaScript is more fun than Java!" ;
var result;
while ( result = pattern.test ( text) )
{
        document.write ( " next search begins at " + pattern.lastIndex + "<br/>" ) ;
}

总结及唠叨:

这篇写的可能有些晕,大家对lastIndex可能不是很理解,这里再废话一下,String的方法search()、replace()和match()都没有像RegExp的exec()和test()那样使用RegExp 对象的lastIndex属性(对,这个属性是RegExp也就是正则表达式对象的属性),事实上,String方法只是将lastIndex重置为0. 并且大家一定要记住,在用exec()和test()时,只有匹配标志为g全局的时候才会有这个lastIndex属性的改变

正则表达式是一门高深的学问,自问水平不行,这里只是照着书中的例子操作了一番,还没有敲太高深的例子,自己看不懂哈。 呵呵。学学是很有必要的,但是水平有限,如果大家有兴趣的话,可以自己去买书钻研一下,这里不再多说了。

持续半个月之久的JavaScript正则表达式系列已经结束了,开心。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章