首页 > JavaScript > JavaScript 用于模式匹配的 RegExp 方法
2009八月16

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正则表达式系列已经结束了,开心。

文章作者:simaopig
本文地址:http://www.xiaoxiaozi.com/2009/08/16/1362/
版权所有 © 转载时必须以链接形式注明作者和原始出处!

4 Responses to “JavaScript 用于模式匹配的 RegExp 方法”

  1. #1 老饕 回复 | 引用 Post:2009-08-17 10:18

    ~~~~莫看懂,留个脚印,支持一下! :D

    [回复]

  2. #2 小Bee 回复 | 引用 Post:2009-08-17 12:35

    将来会有用的…

    [回复]

  3. #3 Showfom 回复 | 引用 Post:2009-08-17 15:42

    路过路过
    反正看不懂 哦哈哈 8)

    [回复]

  4. #4 peichen 回复 | 引用 Post:2009-08-19 11:19

    mark~~收藏了~~

    [回复]

发表评论

:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)