var s = [];
    function op(str) {
        s.push(str);
        var p = s.join("");
        //如果p字符串满足这样的要求:以'['开始并且以']'结束,则我想获取位于[]之间的数据
        //例当前p="[1welcome][2china][welcome t";
        //我想获取1welcome以及2china,并且将[1welcome]和[2china]从p中删除或替换为空字符''
        //将余下部分[welcome t保留
        //这样结果就是p="[welcome t"
        //可以使用console.log();打印匹配结果
    };    //测试用例
    op("[welcome to china]"); //这样调用p等于'',打印出welcome to china
    op("[welcome t");   //这样调用p="[welcome t"
    op("o china][wel"); // 这样调用p="o china][wel"
    op("[1welcome][2china][welcome t"); //这样调用打印出1welcome,2china,p="[welcome t"不知道我是否已经描述清楚了,正则一直学的不好,请大家帮帮忙了。谢谢。 

解决方案 »

  1.   

    javascript不支持前宽断言的,我也想看看有无高手可以一步到位做到。
      

  2.   


    感谢你的回复,"我也想看看有无高手可以一步到位做到。"
    不太理解,可以在循环中输出满足条件的1welcome和2china
    其实,我只是想得匹配的值
      

  3.   

    replace可以有回调的,你可以这样
    <script>
    var s = [];                    
    function op(str) {             
            var p = str;           
            //s.push(str);         
            //var p = s.join("");  
            //如果p字符串满足这样的要求:以'['开始并且以']'结束,则我想获取位于[]之间的数据
            //例当前p="[1welcome][2china][welcome t";
            //我想获取1welcome以及2china,并且将[1welcome]和[2china]从p中删除或替换为空字符''
            //将余下部分[welcome t保留
            //这样结果就是p="[welcome t"
            //可以使用console.log();打印匹配结果
            var rt = [];           
            p = p.replace(/\[([^\]]*)\]/g,function($_0,$_1){
                    rt[rt.length] = $_1;
                    return '';     
            })                     
            alert('Match:'+rt.join(','))
            return p;              
    };alert("p="+op("[welcome to china]")); //这样调用p等于'',打印出welcome to china
    alert("p="+op("[welcome t"));   //这样调用p="[welcome t"
    alert("p="+op("o china][wel")); // 这样调用p="o china][wel"
    alert("p="+op("[1welcome][2china][welcome t")); //这样调用打印出1welcome,2china,p="[welcome t"
    </script>
      

  4.   

    如果我没理解错楼主的题意,这个答案灰常不错。一个js典型应用。但是 如果lz想支持嵌套,那只能说纯正则不行哟
      

  5.   


    function op(str)
    {
    var tmp;
    var rep =/\[([^\]]+)\]/g
    var ret ={
    count : 0,
    result : [],
            rightContext:""
    };

    while((tmp=rep.exec(str))!==null){
        ret.result.push(tmp[1])
        ret.count++;
    }
    ret.rightContext=RegExp.rightContext;
    return ret;
    }
    op("[1welcome][2china][welcome t") 
    // return {count : 2,    rightContext : "[welcome t",    result : [ 1welcome , 2china ] } 
      

  6.   

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>
    </head>
    <body>
    <script>

        var s = [];
        function op(str) {
         var result = [];
            s.push(str);
            var p = s.join("");
            //如果p字符串满足这样的要求:以'['开始并且以']'结束,则我想获取位于[]之间的数据
            //例当前p="[1welcome][2china][welcome t";
            //我想获取1welcome以及2china,并且将[1welcome]和[2china]从p中删除或替换为空字符''
            //将余下部分[welcome t保留
            //这样结果就是p="[welcome t"
            //可以使用console.log();打印匹配结果
            p = p.replace(/\[([^\[\]]*)\]/g, function(){
             console.log(arguments[3]);
             result.push(arguments[1]);
             return '';
            });
            console.log("p: " + p +"; result: " + result);
            return result;
        };    //测试用例
        op("[welcome to china]"); //这样调用p等于'',打印出welcome to china
        op("[welcome t");   //这样调用p="[welcome t"
        op("o china][wel"); // 这样调用p="o china][wel"
        op("[1welcome][2china][welcome t"); //这样调用打印出1welcome,2china,p="[welcome t"
    </script>
    </body>
    </html>
      

  7.   

    有点不太懂LZ的意思,你是想把op函数弄成有状态的还是没状态的?
    1.有状态:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>
    </head>
    <body>
    <script>

        var s = [];
        function op(str) {
         var result = [];
            s.push(str);
            var p = s.join("");
            //如果p字符串满足这样的要求:以'['开始并且以']'结束,则我想获取位于[]之间的数据
            //例当前p="[1welcome][2china][welcome t";
            //我想获取1welcome以及2china,并且将[1welcome]和[2china]从p中删除或替换为空字符''
            //将余下部分[welcome t保留
            //这样结果就是p="[welcome t"
            //可以使用console.log();打印匹配结果
            p = p.replace(/\[([^\[\]]*)\]/g, function(){
             result.push(arguments[1]);
             return '';
            });
            console.log("p: " + p +"; result: " + result);
            return result;
        };    //测试用例
        op("[welcome to china]"); //这样调用p等于'',打印出welcome to china
        op("[welcome t");   //这样调用p="[welcome t"
        op("o china][wel"); // 这样调用p="o china][wel"
        op("[1welcome][2china][welcome t"); //这样调用打印出1welcome,2china,p="[welcome t"
    </script>
    </body>
    </html>
    2.无状态:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>
    </head>
    <body>
    <script>

        function op(str) {
         var result = [];
            //如果p字符串满足这样的要求:以'['开始并且以']'结束,则我想获取位于[]之间的数据
            //例当前p="[1welcome][2china][welcome t";
            //我想获取1welcome以及2china,并且将[1welcome]和[2china]从p中删除或替换为空字符''
            //将余下部分[welcome t保留
            //这样结果就是p="[welcome t"
            //可以使用console.log();打印匹配结果
            var p = str.replace(/\[([^\[\]]*)\]/g, function(){
             result.push(arguments[1]);
             return '';
            });
            console.log("p: " + p +"; result: " + result);
            return result;
        };    //测试用例
        op("[welcome to china]"); //这样调用p等于'',打印出welcome to china
        op("[welcome t");   //这样调用p="[welcome t"
        op("o china][wel"); // 这样调用p="o china][wel"
        op("[1welcome][2china][welcome t"); //这样调用打印出1welcome,2china,p="[welcome t"
    </script>
    </body>
    </html>