`
阅读更多

如何过滤掉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
分享到:
评论

相关推荐

    自主研发的批量保留路径清理代码注释工具

    聪哥创作的一款批量保留路径清理代码注释的工具,目前兼容大...3.增加ruby语言的多行注释清理的能力 2022年11月25日更新日志: 1.修复了行内//注释无法清除的bug 2.增加了默认文件类型内容。 3.提升软件的清理性能。

    java代码统计工具

    在Java中,单行注释以"//"开始,多行注释以"/**/"包裹,而在类、方法或变量声明前的"/*...*/"形式的注释也被视为多行注释。代码统计工具需要识别这些模式,并将它们分类。 `CodeCounter.java`很可能包含了读取文件...

    java代码计算行数

    Java中的注释主要有单行注释(//)和多行注释(/*...*/)。可以使用正则表达式来匹配这些注释模式。 5. **计数**:根据行的类型,增加相应的计数器。例如,可以定义三个计数器:总行数、代码行数和注释行数。 6. *...

    C#和Java的区别(适合初学者)

    Java的注释方式类似,但多行注释还可以使用`/**...*/`,用于生成Javadoc。 10. 自动补全与快捷键: 在C#中,`Ctrl+Shift+F`用于格式化全部代码,`Ctrl+J`用于自动补全,`cw+Tab+Tab`可以快速输入`console.WriteLine...

    Java net 代码计算工具

    例如,在Java中,单行注释以"//"开始,多行注释则以"/*"开始并以"*/"结束。此外,工具可能还会识别三引号字符串("""..."""/'''...''''),它们在某些情况下用于创建多行字符串,但也可以用于添加文档字符串。 在...

    java实现统计代码行数

    当然,对于不同编程语言,代码行的定义可能不同,例如C++或Java中多行注释(/* ... */)、XML、HTML等,可能需要更复杂的解析逻辑。 此外,为了统计特定格式的文件,我们可以在`countLines()`方法中添加条件判断,...

    获取项目源代码行数java类

    Java注释包括单行注释(`//`)和多行注释(`/* */`)。我们可以通过正则表达式匹配这些模式,过滤掉它们。剩下的行被视为代码行。 4. **结果统计**:统计每个文件的代码行数,并将其累加到总行数中。可能还需要记录...

    java代码统计器 要安装java虚拟机才能运行

    \\*/`匹配多行注释,`//.*?$`匹配单行注释,并排除空白行。 在统计过程中,程序可能还需要考虑嵌套结构,如方法或类定义内的代码行。为了处理这种情况,可以使用语法解析库,如ANTLR或JavaCC,它们能解析Java源代码...

    代码行统计工具java源码

    Java源码中的注释分为单行注释(//)和多行注释(/*...*/),工具会通过特定的规则过滤掉这些非执行代码。 4. **结果输出**:统计完成后,工具会将结果以报表的形式输出,可能包括总代码行、注释行、空行等信息。在...

    Core_java复习用的,如有不明白,查看权威资料

    - **注释**:分为单行注释(`//`)、多行注释(`/* */`)和文档注释(`/** */`)三种形式。 - **标识符**:用来命名类名、变量名等,遵循一定的命名规则。 - **关键字**:如`abstract`、`continue`、`for`等,用于定义Java...

    达内java课程笔记

    3. Java的注释:讲解了Java代码中注释的种类,包括单行注释、多行注释和文档注释。 **Java变量与数据类型** 1. Java变量:讲解变量的定义、命名规则以及作用域。 2. 进制转换基础:涉及到二进制、八进制和十六进制...

    java解释器初步之词法分析

    此外,词法分析器还需要处理注释,包括单行注释(以`//`开始)和多行注释(以`/*`和`*/`包围)。 在这个实现中,词法分析器能够正确地识别和过滤掉注释,确保后续的解析阶段只处理有效代码。对于Java,词法分析器还...

    Java基础学习极其代码

    Java中的注释有单行注释(//)、多行注释(/*...*/)和文档注释(/**...*/,用于生成API文档)。 2. **数据类型**:Java分为两种数据类型:基本类型(如int、char、boolean)和引用类型(类、接口、数组)。基本...

    Eclipse生成Java doc

    Java doc注释通常以`/**`开头,以`*/`结尾,中间可以包含多行描述、参数、返回值、异常、作者等信息。例如: ```java /** * 这是一个示例方法,用于计算两个整数的和。 * * @param num1 第一个整数 * @param ...

    阿里巴巴Java开发手册(公开版).zip_java开发手册

    类、方法和复杂的逻辑应有相应的注释说明,单行注释通常使用//,多行注释使用/*...*/。 二、异常处理 1. 异常分类:根据异常的可恢复性,将其分为检查异常和运行时异常。检查异常需要显式捕获,运行时异常则由代码...

    程序代码行统计工具,可统计Java,C,C++,.Net程序行数

    对于C#、Java、C++和.NET文件,我们需要注意它们的语法特点,如C#和Java中的`//`单行注释和`/*...*/`多行注释,以及C++中的`//`和`/*...*/`。为了过滤掉这些注释,我们可以使用正则表达式或者自定义的解析器逐行扫描...

    java面试传问题

    1. **JavaDOC注释**:JavaDOC注释是一种特殊格式的多行注释,用于生成API文档。它通常应用于类、方法和接口之上,以便为其他开发人员提供关于代码功能的详细描述。 2. **包的作用**:包在Java中主要用于组织类,...

    java笔记

    - **注释类型**:Java中有三种注释方式:单行注释(`//`)、多行注释(`/* */`)和文档注释(`/** */`)。文档注释可以被`javadoc`工具提取并生成API文档。 #### 七、命名约定 - **类名**:首字母大写,多个单词...

    《阿里巴巴》Java开发手册

    阿里巴巴手册建议使用Javadoc来注释公共API,用单行或多行注释来解释复杂的逻辑或特殊情况。注释应简洁明了,避免重复代码中的显而易见的信息。 4. **控制语句**:手册对if、for、while等控制语句的使用进行了规定...

Global site tag (gtag.js) - Google Analytics