如何过滤掉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