loading tweet...

正则表达式对象与全局RegExp对象

Posted: July 21st, 2006 | Author: htmlor | Filed under: javascript | 1 Comment »

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种比较常用。这些方法的具体使用以后再谈。


One Comment on “正则表达式对象与全局RegExp对象”

  1. 1 天天基金网 said at 04:10 on November 28th, 2007:

    看得有点头晕了。


Leave a Reply