`
53873039oycg
  • 浏览: 841463 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Java应用之删除注释和英文大小写转换

    博客分类:
  • java
阅读更多

    最近写博客上传代码的时候,用于代码里写了些很随意的注释,想把注释全部删掉,在网上找了下代码,发现很多都是使用正则表达式替换的,如

   

Map<String, String> patterns = new HashMap<String, String>();
		patterns.put("([^:])\\/\\/.*", "$1");// 匹配在非冒号后面的注释,此时就不到再遇到http://
		patterns.put("\\s+\\/\\/.*", "");// 匹配“//”前是空白符的注释
		patterns.put("^\\/\\/.*", "");
		patterns.put("^\\/\\*\\*.*\\*\\/$", "");
		patterns.put("\\/\\*.*\\*\\/", "");
		patterns.put("/\\*(\\s*\\*\\s*.*\\s*?)*\\*\\/", "");

    使用过程中发现,这样替换是有问题的,如下上测试例子:

   

/**
 * 这是注释//嵌套注释
 * 
 * @author Administrator 测试 修改日期:2014-02-17
 */
public class 测试注释 {

	/**
	 * 测试注释 <[CDATA\**测试]>
	 * 
	 * @param fileName
	 * @param outFileName
	 */
	public void TestFile(String fileName, String outFileName) {
		/**
		 * 输出语句测试
		 */
		System.out.println("/*我是正常内容*/");// 测试注释L16
		/* 测试注释L17 */
		System.out.println("//注释哈哈");
		//今天是2014-02-17
		System.out.println("/*" +
		                            "* 测试" + //注释,能删除吗
				                   /*测试L20*/ "注释*/");
	}
}

   这种正则替换的结果是:

  

     正常内容也被替换掉了,所以在替换之前要先判断是否是在" "里面。

     在网上找了个靠谱点的代码,先上参考链接:

    

http://jdksummer.iteye.com/blog/976707 

    他的方法是先判断是否在""内再替换。如下:

   

 public void run(String inputF,String outputF) throws IOException {
        this.inputFile=inputF;
        this.outputFile=outputF;

        File file = new File(inputFile);
        if (!file.exists() || file.isDirectory()) {
            throw new FileNotFoundException();
        }

        // 写出文件初始
        File writefile = new File(outputFile);
        if (!writefile.exists()) {
            writefile.createNewFile();
        }
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(writefile)));

        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
        boolean flagFindhead = true; // 多行注释找头
        boolean markFinded = false;  //是否发现双引号
        int i = 0;
        String temp = null;
        temp = br.readLine();
        while (temp != null) {
            if (temp != null) {
                StringBuilder sb = new StringBuilder();
                for (i = 0; i < temp.length(); i++) {
                                  //此处一定要注意判断是否在双引号内
                    if (temp.charAt(i) == '/' && !(i > 0 && markFinded)) {            
                        if (i + 1 < temp.length() && temp.charAt(i + 1) == '/') {  
                            break;
                        } else if (flagFindhead && i + 1 < temp.length()
                                && temp.charAt(i + 1) == '*') {
                            flagFindhead = false;
                            for (int j = i + 1; j < temp.length(); j++) {
                                i = j;
                                if (temp.charAt(j) == '*'
                                        && (j + 1 < temp.length() && temp.charAt(
                                                                 j + 1) == '/')) {
                                    flagFindhead = true;
                                    i += 2;
                                    break;
                                }
                            }
                        }
                    }

                    if (!flagFindhead && temp.charAt(i) == '*'
                            && (i + 1 < temp.length() && temp.charAt(i + 1) == '/')) {
                        flagFindhead = true;
                        i += 2;
                    }
                    if (flagFindhead && i < temp.length()) {
                         //发现双引号“ ,置发现标志为true,即进入了双引号的范围
                        if(temp.charAt(i)=='\"' && markFinded==false)           
                            markFinded=true;
                        //发现双引号” ,置发现标志为false,即已经出了双引号的范围
                        else if(temp.charAt(i)=='\"' && markFinded==true) 
                            markFinded=false;
                        sb.append(temp.charAt(i));
                    }
                }
                temp = sb.toString();
            }
            if (temp.length() > 0) {
                bw.write(temp + "\r\n");
                bw.flush();
            }
            temp = br.readLine();
        }

        br.close();
        bw.close();
    }

   使用后发现文件中出现很多的空白,我修改了下,把空白行去掉了。

  

public void delFileComment(String inputFile, String outputFile,String charSet)
			throws IOException {
		if(charSet==null)
		{
			charSet="utf-8";
		}
		File file = new File(inputFile);
		if (!file.exists() || file.isDirectory()) {
			throw new FileNotFoundException();
		}
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
				new FileOutputStream(outputFile),charSet));
		BufferedReader br = new BufferedReader(new InputStreamReader(
				new FileInputStream(file),charSet));
		boolean flagFindhead = true; // 多行注释找头
		boolean markFinded = false; // 是否发现双引号
		int i = 0;
		String temp = null;
		temp = br.readLine();
		while (temp != null) {
			if (temp != null) {
				StringBuilder sb = new StringBuilder();
				for (i = 0; i < temp.length(); i++) {
					// 此处一定要注意判断是否在双引号内
					if (temp.charAt(i) == '/' && !(i > 0 && markFinded)) {
						if (i + 1 < temp.length() && temp.charAt(i + 1) == '/') {
							break;
						} else if (flagFindhead && i + 1 < temp.length()
								&& temp.charAt(i + 1) == '*') {
							flagFindhead = false;
							for (int j = i + 1; j < temp.length(); j++) {
								i = j;
								if (temp.charAt(j) == '*'
										&& (j + 1 < temp.length() && temp
												.charAt(j + 1) == '/')) {
									flagFindhead = true;
									i += 2;
									break;
								}
							}
						}
					}
					if (!flagFindhead
							&& temp.charAt(i) == '*'
							&& (i + 1 < temp.length() && temp.charAt(i + 1) == '/')) {
						flagFindhead = true;
						i += 2;
					}
					if (flagFindhead && i < temp.length()) {
						// 发现双引号“ ,置发现标志为true,即进入了双引号的范围
						if (temp.charAt(i) == '\"' && markFinded == false)
							markFinded = true;
						// 发现双引号” ,置发现标志为false,即已经出了双引号的范围
						else if (temp.charAt(i) == '\"' && markFinded == true)
							markFinded = false;
						sb.append(temp.charAt(i));
					}
				}
				temp = sb.toString();
			}
			// 把空白换成"",然后使用trim过滤掉。
			temp = temp.replaceAll("\\s*\n", "");
			if (temp.trim().length() > 0) {
				bw.write(temp + "\r\n");
				bw.flush();
			}
			temp = br.readLine();
		}
		br.close();
		bw.close();
	}

    测试结果如下:

   

    结果很正确。

   

    写博客中遇到的另一个问题是我的SQL语句有时候没注意,一会大写,一会小写,一点也不规范,所以自己写了个简单的类,把文件转换大写或者小写。

   

public void convertContentTLowerCase(String fileName, String chartSet) {
		convertContent(fileName, true, chartSet);
	}

	public void convertContentTUpperCase(String fileName, String chartSet) {
		convertContent(fileName, false, chartSet);
	}

	public void convertContent(String fileName, boolean isLower, String chartSet) {
		if (chartSet == null) {
			chartSet = "utf-8";
		}
		String outFileName = fileName.substring(0, fileName.lastIndexOf("."))
				+ "_result" + fileName.substring(fileName.lastIndexOf("."));
		BufferedReader br = null;
		BufferedWriter bw = null;
		try {
			br = new BufferedReader(new InputStreamReader(new FileInputStream(
					fileName), chartSet));
			bw = new BufferedWriter(new OutputStreamWriter(
					new FileOutputStream(outFileName), chartSet));
			String tempStr = null;
			while ((tempStr = br.readLine()) != null) {
				if (isLower) {
					tempStr = tempStr.toLowerCase();
				} else {
					tempStr = tempStr.toUpperCase();
				}
				bw.write(tempStr + "\r\n");
			}
			bw.flush();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (br != null) {
					br.close();
				}
				if (bw != null) {
					bw.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

   上面要2个路径是因为我我想读一行写一行 ,核心就是String的toUpperCase。

   

      上面的代码都很简单,这是我自己用的,请不要询问我有什么意义,对我我用就是意义,谢谢。

   

      全文完。

   

 

  • 大小: 36.6 KB
  • 大小: 39.3 KB
4
0
分享到:
评论
2 楼 53873039oycg 2014-02-18  
jorneyR 写道
String s1 = "hi/*ni hao */";
String s2 = "hi // ni hao";
String s3 = "hi"; /* "ni hao" */
String s4 = "hi"; // "ni hao"
String s5 = "hi"; // /* ni hao*/
......

有没有测试过这些?

你好,这些测试结果是
String s1 = "hi/*ni hao */";
        String s2 = "hi // ni hao";
		String s3 = "hi"; 
		String s4 = "hi"; 
		String s5 = "hi"; 
1 楼 jorneyR 2014-02-18  
String s1 = "hi/*ni hao */";
String s2 = "hi // ni hao";
String s3 = "hi"; /* "ni hao" */
String s4 = "hi"; // "ni hao"
String s5 = "hi"; // /* ni hao*/
......

有没有测试过这些?

相关推荐

    人民币大小写转换Java版

    java 人民币大小写转换 利用BufferString和正则表达式做的。。。不到70行的代码,注释相当的详细,当然也写了一个C版本的,要的话,可以留下Email

    java实现人民币大小写转换方法分享

    8. **最终结果**:整数部分的处理结果(prefix)和小数部分的处理结果(suffix)组合在一起,加上“整”字(代表无小数部分),就构成了完整的人民币大小写转换结果。 9. **代码注释**:代码中包含了丰富的注释,...

    整数大小写转换

    在编程领域,大小写转换是一项常见的任务,尤其在处理用户输入、格式化输出或与文本相关的操作时。本文将深入探讨如何用20行代码实现整数大小写的转换,主要涉及的是将整数转换为其对应的大小写字母表示。这个过程...

    java 课程设计大作业 写的塔防小游戏(含完整注释)

    这篇文档将深入解析《java 课程设计大作业 写的塔防小游戏》的相关知识点,它不仅是一个游戏项目,还包含了完整的注释和不同版本的源代码,为学习者提供了逐步了解游戏开发的过程。 首先,我们要关注的是编程语言...

    java源码包---java 源码 大量 实例

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    java 写的可以把表格转换为导入Trados的txt文件的小工具

    Java编程语言以其强大的通用性和灵活性,常被用来开发各种实用工具,包括处理数据转换的任务。在翻译领域,Trados是一款广泛使用的计算机辅助翻译(CAT)软件,它可以帮助专业翻译人员提高工作效率,保持术语一致性...

    电大JAVA语言作业答案

    3. 大小写敏感:Java语言是区分大小写的,这意味着同样的单词但大小写不同会被视为不同的标识符,如变量名。 4. 变量声明:在Java中,变量必须先声明后使用,且有其特定的数据类型,例如int、double等。 5. 注释的...

    JAVA结构化程序设计.ppt

    标识符的命名规则是以Java字母开头,由Java字母和Java数字组成,大小写敏感,且长度没有限定。不能使用Java关键字、运算符,不能使用空格。 3. 变量:变量是程序中用来存储数据的存储单元。变量的声明包括变量的...

    用Java语言写的JPEG图象生成器程序

    本话题聚焦于一个特定的应用——"用Java语言写的JPEG图象生成器程序",这是一个适用于课程设计和学习管理系统开发的宝贵资源。 首先,我们要理解JPEG(Joint Photographic Experts Group)是一种广泛使用的有损图像...

    统计字母个数 java小程序

    ### 统计字母个数Java小...通过分析代码逻辑、关键API以及可能的改进方向,我们可以更好地理解和应用这些技术。这个小程序不仅适用于初学者学习基本的Java编程概念,而且还可以作为实际项目中的一个基础模块进行扩展。

    磨砺营java第一课课程课件

    Java代码严格区分大小写,支持自由格式书写,分为结构定义语句和功能执行语句,功能执行语句以分号结束。 Java跨平台原理:Java程序之所以能跨平台运行,是因为它首先被编译成中间格式的字节码,然后由Java虚拟机...

    Java培训之基础篇 Java培训之基础篇

    - 命名规范:遵循驼峰命名法,区分大小写,避免使用Java保留字,确保名称有意义且唯一。 - 运算符:包括算术运算符、比较运算符、逻辑运算符、位运算符、赋值运算符和三元运算符等。 7. Java其他基础知识 - 控制...

    Java开发技术大全(500个源代码).

    ReadAndWrite.java 读入和写出数据 ReadAndWriteFile.java 读入数据写出到文件 Student.java 定义一个用来序列化的类 ThreadIn.java 接收数据用的线程类 ThreadOut.java 发送数据用的线程类 TypeFile.java ...

    java基础知识技术

    标识符区分大小写,且不能使用Java关键字。 - **分隔符**:包括分号、大括号、中括号、小括号等,用于分隔不同的代码块和表达式。 - **注释**:单行注释(`//`)、多行注释(`/* */`)和文档注释(`/** */`),其中...

    Java 实例 - 字符串小写转大写源代码-详细教程.zip

    在Java编程语言中,字符串是极其重要的...总的来说,Java的字符串大小写转换功能是基础且实用的,是每个Java开发者必备的技能之一。通过深入理解和实践,你可以更好地驾驭这个强大的工具,提升代码的灵活性和可读性。

    Java基础知识梳理

    格式:javac 文件名.java(不区分大小写) * 使用 java 命令,运行 class 文件。格式:java 类名(区分大小写) 二、Java 基础知识 * 一个 JAVA 文件中可以有多个类。 * 一个 JAVA 文件中只能有一个公有(public)...

    java源码包3

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    java入门基础学习笔记

    标识符由字母、数字、下划线(_)和美元符号($)组成,但不能以数字开头,不能与Java关键字冲突,且严格区分大小写。 Java中有五种基本数据类型,分别是整数型(如int、long)、小数型(如float、double)、布尔型...

Global site tag (gtag.js) - Google Analytics