在网上看个问题,觉得应该是正则写,可是水平不高,搞不定,希望大伙帮忙写写!!!"abc|abc()|abc(a)|abc(a|b)" 
如何按 | 分割 
但是过滤掉()内的 | 
即分隔成
分割成
abc 
abc()
abc(a)
abc(a|b)
js 字符串 正则

解决方案 »

  1.   

    s="abc|abc()|abc(a)|abc(a|b)";
    alert( s.match(/\w+\(.*?\)|\w+/g) );
      

  2.   

    var a="abc|abc()|abc(a)|abc(a|b)";
    var reg=/\|(?!\w\))/;
    a=a.split(reg);
    alert(a.join("\n"));
    只适合你这个例子  
      

  3.   


    可以解释下里面的.*?是什么意思么
    另外s="abc|abc()|abc(a)|abc(a|b)abc";
    好像就不行了
      

  4.   

    抛砖引玉,请高手指正。script>
    /*
    //问题的关键是如何排除括号中的"|"匹配。我的思路是把括号中的"|"予以标记,使其不命中匹配,自然的就会想到把这些
    //特别的"|"替换成特别的字符串,作为例子,这里我用"&"替换这些特殊的"|".接下来又会产生一个新问题,如何识别这些
    //特别的"|"? 可以发现我们的目标中涉及到的特殊的"|"可以这样定义:所有在成对的括号中的"|".接下来的思路就是找到
    //所有成对的括号,并把里面的"|"替换为对于字符串而言特别的字符串(此处为&),接着再利用pattern=/(.*?)\|/gm 查询,
    //获得查询结果后把对应的字串还原为原来的状态就行了(即把"&"替换会"|").现在唯一遗留的问题就是如何找到成对的括号?
    //我们知道,括号的匹配关系是从内向外的顺序匹配的,所有从内层向外逐层扫描成对括号。找成对的括号不是目的,而是为了
    //标记里面的"|",通过模式 var pattern=/\([^\(]*?\)/gm 把最里层的成对括号查询出,并替换其中的"|",同时把左右括号也
    //替换为其他特别的字符串(left="@"; right="#";),这样才不会影响外面一层的扫描替换。把分割得的结果中的特殊字符替换回去
    //就行了。下面是代码:  */
    var text="abc|abc()|abc(a)|abc(a|b)" ;
    var left="@";
    var right="#";
    var or="&";
    var noKH="";
    var noOr="";
    var textNoOrInKH=text;
    var matches="";var pattern=/\([^\(]*?\)/gm;   //匹配成对的括号
    while((matches=pattern.exec(text))){
    //alert(matches[0]);//把匹配字符串中的"|"、"("、")"替换掉noKH=left+matches[0].substring(1,matches[0].length-1)+right;
    //alert("noKH:"+noKH);
    noOr=noKH.replace(/(\|)/,or);
    //alert("noOr:"+noOr);
    textNoOrInKH=textNoOrInKH.replace(matches[0],noOr);
    //alert(textNoOrInKH);
    }//获取目标字串
    pattern=/(.*?)\|/gm;
    var resultList=new Array();textNoOrInKH+="|"
    while((matches=pattern.exec(textNoOrInKH))){
    //alert(matches[0]);
    resultList.push(matches[1]);
    //alert(resultList);
    }
    //把目标字串中的特殊字符还原for(var i=0;i<resultList.length;i++){
    resultList[i]=resultList[i].replace(new RegExp(left,"gm"),"(");
    //alert(resultList);
    resultList[i]=resultList[i].replace(new RegExp(right,"gm"),")");
    //alert(resultList);
    resultList[i]=resultList[i].replace(new RegExp(or,"gm"),"|");
    //alert(resultList);
    }
    alert(resultList);</script>
      

  5.   

    .*?,的后面的所有字符0~n个非贪婪模式,后面的能匹配就留给后面的
    s="abc|abc()|abc(a)|abc(a|b)abc";
    s=s.replace(/\((\w+)\|(\w+)\)/g,'($1\3\$2)').replace(/(?:(\w+\([^\|]*?\)[^|]*)|(\w+))\|?/g,
      function(_,s1,s2){return (s1||s2).replace(/\3/g,'-')+'\n' });
    alert(s);