正则表达式对象与全局RegExp对象
javascript内部对象中,关于正则表达式有两个对象:正则表达式对象(regular expression object)与全局RegExp对象(global RegExp object)。这两者很容易被混淆。以下主要说明它们的不同。
正则表达式对象需要创建,如 var re = new RegExp("\\d{4}", "ig");(同 var re = /\d{4}/ig;)。它的属性有lastIndex、source、multiline、ignoreCase、global,方法有compile、exec、test。全局RegExp对象不需要创建就可以直接使用。它的属性有input(opera无)、index(ie专有)、lastIndex(ie专有)、lastMatch(opera无)、lastParen(opera无)、leftContext、rightContext、multiline(firefox专有)和$1-$9,没有方法。
我的理解是,全局RegExp对象是对正则表达式匹配结果的体现,它包含了最新的关于正则表达式匹配的信息。打个比方来说,我正在写一篇文章,10点时文章有100字,1小时后我又加了10个字,然后保存。那么此时的文章就包含了新的信息:最后修改时间由10点变成了11点,字数则由100变成了110。正则表达式匹配就像是修改文章,而全局RegExp对象就是保存后的文章。每次使用正则表达式匹配之后,全局RegExp对象的属性就会随之相应变化。
运行以下代码会看到很明显的结果:
function demo(){
alert("匹配前的 RegExp:\\n" + getRegExpProperties());
var str = "I like Javascript & CSS.";
var re = new RegExp("(.*?)(css)","i");
var matches = str.match(re);
alert("第一次匹配后的 RegExp:\\n" + getRegExpProperties());
alert("第一次匹配得到的数组:\\n" + matches);
var re2 = new RegExp("([A-Z]+)","g");
var matches2 = str.match(re2);
alert("第二次匹配后的 RegExp:\\n" + getRegExpProperties());
alert("第二次匹配得到的数组:\\n" + matches2);
}
function getRegExpProperties(){
var str = "";
if(document.all && window.ActiveXObject){
var keys = ["input","index","lastIndex","lastMatch","lastParen","leftContext","rightContext","$1","$2","$3","$4","$5","$6","$7","$8","$9"];
var key;
for(var i=0; key=keys[i]; i++){
str += key + ": " + RegExp[key] + "\\n";
}
}
else{
for(var key in RegExp){
str += key + ": " + RegExp[key] + "\\n";
}
}
return str;
}
demo();
那么能够改变全局RegExp对象属性的匹配操作有哪些呢?有5种,分别是String对象的match、replace和split方法,以及正则表达式对象的exec和test方法。其中前3种比较常用。这些方法的具体使用以后再谈。
![htmlor [at] gmail.com](http://static.blog.htmlor.com/myimages/htmlor_gmail.gif)

1条评论 »
天天基金网
2007-11-28 04:10
看得有点头晕了。
评论feed