function trim(s){
var re=/^\s*(.*?)\s*$/;
//return re.exec(s)[1];
return s.replace(re,'$1');
}
alert("|"+trim("  asbc   cxv    ")+"|");
在这段代码中为何(.*?)匹配的不是a而是asbc   cxv    。         

解决方案 »

  1.   

    那你忽视了*号的作用了 
    *表示匹配. 0-N次
    直到遇到\s空格为止如果不加问号
    遇到\s也会一直匹配  直到遇到最后一个\s 空格为止
    此时$1是  asbc cxv
      

  2.   

    想匹配$1为a的话
    可以这样:
    /\s*(\S+?)\s*/
      

  3.   


    .貌似是表示任意字符,后面加*应该是直接匹配到结尾而不是遇到\s就结束吧,否则$1得到的将是asbc
      

  4.   

    其实我是想问(.*?)不是属于惰性匹配吗,也就是竟可能匹配少的内容,但我却得到了asbc cxv 。这就是我的疑问。
      

  5.   

    /^\s*(.*?)\s*$/;
    " asbc cxv "如果说匹配a的话 那么接下来 \s*肯定能匹配 但是$怎么办呢 不能匹配对吧 。所以回溯继续匹配as
    接下来asbc cxv全匹配完 发现$可以匹配的时候 才停止匹配
      

  6.   

    正则基础之——NFA引擎匹配原理
    先看看这个吧。以防理解屈了。
      

  7.   

    嗯,谢谢,可能是我理解有误,我也是刚刚在自学js,方便加我QQ(849384615)啊,一起讨论学习哈
      

  8.   

    \s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
    * 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。
    . 匹配除换行符 \n之外的任何单字符。要匹配 .,请使用 \。
    ? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。
    $ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,请使用 \$。
      

  9.   

       2、惰性量词1        var regexp = /.*?bbb/g;
    2        var a = str.match(regexp);
    3        alert(a.length);   //output:3
    4        alert(a[0]);       //output:abbb
    5        alert(a[1]);       //output:aabbb
    6        alert(a[2]);       //output:aaabbb
        惰性量词的工作过程可以这样表示:
          a)a
          b)ab
          c)abb
          d)abbb //保存结果,并从下一个位置重新开始
      
          e)a 
          f)aa 
          g)aab
          h)aabb
          j)aabbb //保存结果,并从下一个位置重新开始
      
          e)a
          e)aa
          e)aaa
          e)aaab 
          e)aaabb 
          e)aaabbb  //保存结果,并从下一个位置重新开始