天天看点

正则表达式 之过滤注释

正则表达式 之过滤注释

 如上图所示,如何去掉注释呢?

正则表达式 之过滤注释

@test  

    public void test_deletecommen(){  

        string input="b<!-- step的属性seq是 从1 开始的正整数 -->a";  

        system.out.println(input.replaceall("<!--[^<>]*-->", ""));  

    }  

 运行结果:

正则表达式 之过滤注释

 达到预期效果了.

但是

正则表达式 之过滤注释

        string input="b<!-- >step的属性seq是 从1 开始的正整数 -->a";  

正则表达式 之过滤注释

 没有达到预期的结果,为什么呢?因为注释中多了>

如何解决呢?

正则表达式 之过滤注释

    public void test_deletecomment2(){  

        string regex="<!--"+valuewidget.otherwise22("-->")+"-->";  

        system.out.println(input.replaceall(regex, ""));  

ba

达到预期了.

方法otherwise22 的实现如下:

正则表达式 之过滤注释

/*** 

     * 不包含 

     * @param regex 

     * @return 

     */  

    public static string otherwise22(string regex){  

        int length=regex.length();//共有length * length种情况  

        string[][] arr2=new string[length][];  

        for(int i=0;i<length;i++){  

            string[] arr3=new string[2];  

            arr3[0]=string.valueof(regex.charat(i));  

//          if(arr3[0].equals("*")){  

//              arr3[0]="\\*";  

//          }  

            arr3[1]="[^"+arr3[0]+"]";  

//          system.out.println(arr3[0]+" "+arr3[1]);  

            arr2[i]=arr3;  

        }  

//      string[]result=new string[2^3];  

//      for(int i=0;i<length;i++){  

//          result[i]=arr2[i][0];  

//      }  

        //   \u4e00-\u9fa5 是为了匹配汉字  

        string normal="[\\w\u4e00-\u9fa5\\s\"']*?";  

        list<stringbuffer> list33=assemble(arr2,true);  

        int length22=list33.size();  

        stringbuffer sbu=new stringbuffer("(");  

        for(int i=1;i<length22;i++){  

            sbu.append(normal).append(list33.get(i)).append(normal);  

            if(i!=length22-1){  

                sbu.append("|");  

            }  

        sbu.append(")");  

//      system.out.println(list33);  

        return sbu.tostring();  

     *  

     * @param a 

     * @param aa 

     * @param index : 初始值为0 

    private static list<stringbuffer> cc(string[][] aa,int index,list<stringbuffer> list,boolean isdealregex){  

        if(index>=aa.length){//说明已经遍历完成  

            return list;//并不是每次循环都会执行,最后才会执行此语句.  

        string cc[]=aa[index];  

        int length=cc.length;  

        list<stringbuffer> listnew=new arraylist<stringbuffer>();  

        if(list==null||list.size()==0){//首次循环  

            for(int i=0;i<length;i++){//必须保证顺序,所以不能使用 foreach  

                if(isdealregex && cc[i].equals("*")){  

                    cc[i]="\\*";  

                }  

                if(isdealregex){  

                    listnew.add(new stringbuffer(cc[i]+"?"));  

                }else{  

                    listnew.add(new stringbuffer(cc[i]));  

        }else{  

                for(int j=0;j<list.size();j++){//必须保证顺序,所以不能使用 foreach  

                    stringbuffer sb=list.get(j);  

                    stringbuffer sb2=new stringbuffer(sb);  

                    if(isdealregex && cc[i].equals("*")){  

                        cc[i]="\\*";  

                    }  

                    if(isdealregex  ){  

                        sb2.append(cc[i]+"?");  

                    }else{  

                        sb2.append(cc[i]);  

                    listnew.add(sb2);  

        list<stringbuffer> list33=cc(aa, ++index, listnew,isdealregex);  

        if(!valuewidget.isnullorempty(list33)){  

            return list33;  

        return null;  

    /*** 

     * 组合 

    public static list<stringbuffer>assemble(string[][] aa,boolean isdealregex){  

        return cc(aa, 0, null,isdealregex);  

 源代码见附件io0007-find_progess-0.0.8.5-snapshot-sources.jar