加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式 之过滤注释

发布时间:2020-12-14 01:32:47 所属栏目:百科 来源:网络整理
导读:使用java 正则表达式如何过滤掉注释呢? 如上图所示,如何去掉注释呢? @Testpublic void test_deleteCommen(){String input="b!-- step的属性seq是 从1 开始的正整数 --a";System.out.println(input.replaceAll("!--[^]*--",""));} 运行结果: 达到预期效果了.

使用java 正则表达式如何过滤掉注释呢?

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

@Test
	public void test_deleteCommen(){
		String input="b<!-- step的属性seq是 从1 开始的正整数 -->a";
		System.out.println(input.replaceAll("<!--[^<>]*-->",""));
	}

运行结果:

达到预期效果了.

但是

@Test
	public void test_deleteCommen(){
		String input="b<!-- >step的属性seq是 从1 开始的正整数 -->a";
		System.out.println(input.replaceAll("<!--[^<>]*-->",""));
	}

运行结果:

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

如何解决呢?

@Test
	public void test_deleteComment2(){
		String input="b<!-- >step的属性seq是 从1 开始的正整数 -->a";
		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="[wu4E00-u9FA5s"']*?";
		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 i=0;i<length;i++){//必须保证顺序,所以不能使用 foreach
				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;
	}
	/***
	 * 组合
	 * @param aa
	 * @return
	 */
	public static List<StringBuffer>assemble(String[][] aa,boolean isDealRegex){
		return cc(aa,null,isDealRegex);
	}

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读