re.exec(str) = str.match(re)
返回都是数组,re.test(str)返回boolean

解决方案 »

  1.   

    那么 关于re.exec(str) ,str.match(re) 返回都是数组,
    <div id="test" onDblClick="aa();">
       <ul>
             <li><a href="a1.htm">a1</a></li>
             <li><a href="a2.htm">a2</a></li>        
       </ul>
    </div>
    <script>
    function aa(){
    var str= test.innerHTML;
    alert(str);
    var re=/<li>.*<\/li>/ig;
    var aa=re.exec(str);
    for(var i=0;i<aa.length;i++)
    {
        alert(aa[i]);
    }
    }这个返回结果中总是只包含了一个元素,即它匹配的最后一个。按照这个正则式,两个<li>元素都满足,但是返回的数组中只包含了最好一次匹配的结果,就是的二个<li>元素。
    这两个函数是否只包含了最后一次匹配的结果?
      

  2.   

    而且,我测试后知道,如果正则式中含有用员括号括起来的子表达式,/(a-z)(3-9)/,那么匹配后返回的结果数组中还将包含与其中用员括号括起来的子表达式相匹配的字串。比如
    <div id="test" onDblClick="aa();">
       <ul>
             <li><a href="a1.htm">a1</a></li>
             <li><a href="a2.htm">a2</a></li>        
       </ul>
    </div>
    <script>
    function aa(){
    var str= test.innerHTML;var re=/(<li>.*)(<\/li>)/ig;
    var aa=re.exec(str);
    for(var i=0;i<aa.length;i++)
    {
        alert(aa[i]);
    }
    }
    </script>
    exec(str)这个函数返回的数组有三个元素:第一个是最后一次匹配整个正则式的字串:
    <li><a href="a2.htm">a2</a></li>  ,第二个是在第二次匹配中与正则式中第一个括号匹配的:
    <li><a href="a2.htm">a2</a>,第三个是第二次匹配中与正则式中第二个括号匹配的:
    </li>
    然而:第一次匹配的结果:<li><a href="a1.htm">a1</a></li>却不在返回的结果数组中,我觉得这正则式真实不按常理出牌(或者是我的思维习惯有毛病,我总以为,既然两个<li>元素的字串都符合整个正则式,那么结果数组中应该是要包含这个两个字串才对,而不应该去包含最后一次匹配中的匹配子表达式的字串。因为我觉得,我既然写了这样一个正则式,那么我当然希望得到或检测到符合整个正则式的字串,返回结果不应该只包括最后一次匹配到整个正则式的串,它也不应该包含符合其子表达式的字串,因为如果我需要检测符合其子表达式的串,那么我就会单独拿出该正则式中的一个子表达式来使用)
    不知道我的理解是否有问题,请高手指教,我相信这个东西对很多初学者都有用。谢谢
      

  3.   

    这个返回结果中总是只包含了一个元素,即它匹配的最后一个。按照这个正则式,两个<li>元素都满足,但是返回的数组中只包含了最好一次匹配的结果,就是的二个<li>元素。
    这两个函数是否只包含了最后一次匹配的结果?你alert(str)一下str看看就知道了
    这个str的第一个li并没有</li>,只有第二个才有。
    所以只匹配了一个<li>
      

  4.   

    你的正则式有问题,你那样他只要后面还有符合匹配的就会一直匹配下去。
    这样/(<li>.?*)(<\/li>)/ig;试试
      

  5.   

    英语可以的话你可以去它的网瞧下,这里有的,你瞧了会明的
    http://msdn.microsoft.com/library/en-us/script56/html/js56jslrfJScriptMethodsTOC.asp
      

  6.   

    我说下我理解和测试,可能不正确,
    new RegExp()会先转成//后再用的,所以你要求想用\n,得用\\n因为在转换时会消化掉一个\
    而find,split像是不支持的,它会把正则表达式当成字符串来处理,可以试下,如/要/g=="/要/g"
    match,,exec这二个像是相同吧,都是在执行后会更改RegExp的text index等为当前的,所以你可以用FOR来在取得时得到当前的,这样就不会在它执行完后只是取到最后的信息,
    而这个像是只是返回真假和可以用下sourcevalue就是正则表达式本身
    test,
      

  7.   

    到目前为此,我还试不出如何让findtext跨行查找如找以下的字符串:"朝野是喆吉在是是是否 封号右悲叹 
    地区性 "那位要是会或者了解这个方法是不是支持查找\N的话请教下,我等会试下,它是不是也把回车符转成\n字符串,
      

  8.   

    稻草人兄弟明察秋毫!确实这个str的第一个li并没有</li>,但是为什么会没有呢?
    结果数组中为啥会有符合其中圆括号里子表达式的字串呢:比如用var re=/(<li>.*)<\/li>/ig;,数组第二个元素是:<li><a href="a2.htm">a2</a>,可是这并不是我想要的,我既然构造这样一个正则式,我是希望得到sourcettext中符合这整个正则式的内容啊
    大家在教较我
      

  9.   

    那浏览器自动格式化,如加上必要的元素html body等,但是为什么会自己不要了一个,不明,那位能说下?
    (pattern) 匹配pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 '\(' 或 '\)'。 
    (?:pattern) 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。
    我想那位可以写出如下表达式就行了,我想了半天就是不能作到  可以有任何的除了什么  这个,那位以说下,
    <div id="test" onDblClick="aa();">
       <ul>
             <li><a href="a1.htm">a1</a></li>
             <li><a href="a2.htm">a2</a></li>        
       </ul>
    </div>
    <script>
    function aa(){
    var str= test.outerHTML;
    var re=/以<li>开头,中间任何,但不含<li>,要是有</li>就结束查找/gim;
    var a;
    for(; (a=re.exec(str)) != null; ) 
    {
        alert(a.index + "-" + a.lastIndex + "\t" + a);
    }
    }
    </script> 呵,另问下为什么下面的会是假呢?
    <textarea id=text>
    ddd
    ddd
    d
    </textarea>
    <script>
    var rng = text.createTextRange();
    alert(rng.findText(text.value))
    </script>
    而这样会是真
    <textarea id=text>ddddddd</textarea>
    <script>
    var rng = text.createTextRange();
    alert(rng.findText(text.value))
    </script>
      

  10.   

    我顶啊,为什么会少了一个</li>?为什么结果数组中不包含所有匹配项,而去包含子表达式的匹配项
      

  11.   

    因为IE的问题手册上是这么写的
    The LI element is an inline element and does not require a closing tag.IE认为<li>是一个内联标签,并不需要闭合标签。在firefox下面则无此问题。
      

  12.   

    蛙蛙请教:js里的match方法和exec方法的区别,有些晕,大家给解释一下原理先来看第一段代码,这段代码用的是String对象的Match方法,能够弹出3个链接,说明正常匹配,但是里面的((.|\n)*?)和(.*?)我不知道有什么区别.
    <div id="div1">
    <a href="qy.php?id=129"><font color="#000000">北京丰收葡萄酒有限公司 </font></a>
    <a href="qy.php?id=130"><font color="#000000">中国长城葡萄酒有限公司、华夏葡萄酿酒有限公司 </font></a>
    <a href="qy.php?id=132"><font color="#000000">中法合营王朝葡萄酿酒有限公司 </font></a>
    </div>
    <br>
    <SCRIPT LANGUAGE="JavaScript">
    <!--
    var str = div1.innerHTML;
    var re  = new RegExp("<a[^<>]+?\>((.|\n)*?)<\/a>", "gi");
    var a = str.match(re);
    for(var i=0;i<a.length;i++)
    {
    alert(a[i]);
    }
    //-->
    </SCRIPT>再来看第二段儿程序,这里只弹出了两个对话框,而且最后一个弹出的是括号里匹配的内容.
    <div id="div1">
    <a href="qy.php?id=129"><font color="#000000">北京丰收葡萄酒有限公司 </font></a>
    <a href="qy.php?id=130"><font color="#000000">中国长城葡萄酒有限公司、华夏葡萄酿酒有限公司 </font></a>
    <a href="qy.php?id=132"><font color="#000000">中法合营王朝葡萄酿酒有限公司 </font></a>
    </div>
    <br>
    <SCRIPT LANGUAGE="JavaScript">
    <!--
    var str = div1.innerHTML;
    var re = /<a[^<>]+>(.*?)<\/a>/gi;
    var a = re.exec(str)
    for(var i=0;i<a.length;i++)
    {
    alert(a[i]);
    }
    //-->
    </SCRIPT> 这让小弟是很是纳闷儿,我想获取里面的129,130,132这些内容,还有那些链接的显示文本,就是那些汉字,弄的我好头大,真是的,后来经过"梦在流浪"的指点,写出了一下算法,总算是懂了一点正则表达式匹配的原理了,以前看过《javascript宝典》里讲的正则表达式匹配顺序和规律,都忘了。
    <div id="div1">
    <a href="qy.php?id=129"><font color="#000000">北京丰收葡萄酒有限公司 </font></a>
    <a href="qy.php?id=130"><font color="#000000">中国长城葡萄酒有限公司、华夏葡萄酿酒有限公司 </font></a>
    <a href="qy.php?id=132"><font color="#000000">中法合营王朝葡萄酿酒有限公司 </font></a>
    </div>
    <br>
    <SCRIPT LANGUAGE="JavaScript">
    <!--
    var str = div1.innerHTML;
    //alert(str);//这里你可以看到color="#000000"已经变成了color=#000000,没有了引号,所以再写表达式的时候要注意了.
    var re  = new RegExp("<a[^<>]+?\>((.|\n)*?)<\/a>", "gi");
    var a = str.match(re); //第一次搜索
    for(var i=0;i<a.length;i++)
    {
    var temp;
    //alert("第一次搜索的完整匹配,包括括号里面的匹配部分\n"+a[i]);
    temp = a[i].match(/qy.php\?id=(\d+)/ig); //第二次搜索
    //alert("第二次搜索的完整匹配,也就是href的引号中间的部分\n"+temp[0]);
    alert("第二次搜索的匹配结果的括号中的部分,也就是链接的数字参数\n"+RegExp.$1);
    temp = a[i].match(/<font[^<>]+?color=#000000\>(.*?)<\/font>/ig);
    alert("第三次搜索的匹配结果的括号中部分,也就是链接的文本部分\n"+RegExp.$1);
    }
    //-->
    </SCRIPT>
    顺便贴一下“梦在流浪给我的函数”
    <SCRIPT LANGUAGE="JavaScript">
    var str1 = div1.innerHTML;
    var re = /<a[^<>]+>([^a]*?)<\/a>/gi;
    var a = re.exec(str1);
    var b=re.exec(str1);
    var c=re.exec(str1);
    alert(a[1]);
    alert(b[1]);
    alert(c[1]);
    </SCRIPT>  
      

  13.   

    http://www.cnblogs.com/onlytiancai/archive/2005/07/15/193386.html
    看看