`
阅读更多

如何过滤掉Java多行注释呢?

比如"/*aabbcc*/ */aa" 过滤掉注释之后应该是:" */aa"

先看测试:

@Test
	public void ttest_deleteJavaComment(){
		String input="/*aabbcc*/ */aa";
		Assert.assertEquals(" */aa", ValueWidget.deleteJavaComment(input));
		System.out.println(ValueWidget.deleteJavaComment(input));
		
		input="/*aabbcc* */aa";
		Assert.assertEquals("aa", ValueWidget.deleteJavaComment(input));
		
		
		input="/*aabbcc/ */aa";
		Assert.assertEquals("aa", ValueWidget.deleteJavaComment(input));
		
		input="/*aabbcc/ */aa/**/c";
		Assert.assertEquals("aac", ValueWidget.deleteJavaComment(input));
		
		input="/*aabb"+SystemHWUtil.CRLF+"cc/ */aa";
		System.out.println(input);
		Assert.assertEquals("aa", ValueWidget.deleteJavaComment(input));
	}

 测试通过.

 

看看deleteJavaComment 是如何实现的?

/***
	 * 删除Java 块注释
	 */
	public static String deleteJavaComment(String input){
		if(ValueWidget.isNullOrEmpty(input)){
			return input;
		}
		String regex="/\\*"+otherwise22("*/")+"\\*/";
//		System.out.println(regex);
		return input.replaceAll(regex, "");
	}

 依赖的方法:

/***
	 * 
	 * @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, 0, null,isDealRegex);
	}

	/***
	 * 不包含
	 * @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();
		
	}

源代码见附件中的io0007-find_progess\src\main\java\com\string\widget\util\ValueWidget.java 

注意:

(1)* 在正则表达式中需要转义,因为*表示0个或多个;

(2)\w 表示所有单词字符,如果打印出来是\\w,则不对,说明在程序中多了两个斜杠

参考:http://hw1287789687.iteye.com/blog/2149492

1
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics