使用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="[\\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 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);
}
源代码见附件io0007-find_progess-0.0.8.5-SNAPSHOT-sources.jar