最近写博客上传代码的时候,用于代码里写了些很随意的注释,想把注释全部删掉,在网上找了下代码,发现很多都是使用正则表达式替换的,如
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。
上面的代码都很简单,这是我自己用的,请不要询问我有什么意义,对我我用就是意义,谢谢。
全文完。
相关推荐
java 人民币大小写转换 利用BufferString和正则表达式做的。。。不到70行的代码,注释相当的详细,当然也写了一个C版本的,要的话,可以留下Email
8. **最终结果**:整数部分的处理结果(prefix)和小数部分的处理结果(suffix)组合在一起,加上“整”字(代表无小数部分),就构成了完整的人民币大小写转换结果。 9. **代码注释**:代码中包含了丰富的注释,...
在编程领域,大小写转换是一项常见的任务,尤其在处理用户输入、格式化输出或与文本相关的操作时。本文将深入探讨如何用20行代码实现整数大小写的转换,主要涉及的是将整数转换为其对应的大小写字母表示。这个过程...
这篇文档将深入解析《java 课程设计大作业 写的塔防小游戏》的相关知识点,它不仅是一个游戏项目,还包含了完整的注释和不同版本的源代码,为学习者提供了逐步了解游戏开发的过程。 首先,我们要关注的是编程语言...
Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...
Java编程语言以其强大的通用性和灵活性,常被用来开发各种实用工具,包括处理数据转换的任务。在翻译领域,Trados是一款广泛使用的计算机辅助翻译(CAT)软件,它可以帮助专业翻译人员提高工作效率,保持术语一致性...
3. 大小写敏感:Java语言是区分大小写的,这意味着同样的单词但大小写不同会被视为不同的标识符,如变量名。 4. 变量声明:在Java中,变量必须先声明后使用,且有其特定的数据类型,例如int、double等。 5. 注释的...
标识符的命名规则是以Java字母开头,由Java字母和Java数字组成,大小写敏感,且长度没有限定。不能使用Java关键字、运算符,不能使用空格。 3. 变量:变量是程序中用来存储数据的存储单元。变量的声明包括变量的...
本话题聚焦于一个特定的应用——"用Java语言写的JPEG图象生成器程序",这是一个适用于课程设计和学习管理系统开发的宝贵资源。 首先,我们要理解JPEG(Joint Photographic Experts Group)是一种广泛使用的有损图像...
### 统计字母个数Java小...通过分析代码逻辑、关键API以及可能的改进方向,我们可以更好地理解和应用这些技术。这个小程序不仅适用于初学者学习基本的Java编程概念,而且还可以作为实际项目中的一个基础模块进行扩展。
Java代码严格区分大小写,支持自由格式书写,分为结构定义语句和功能执行语句,功能执行语句以分号结束。 Java跨平台原理:Java程序之所以能跨平台运行,是因为它首先被编译成中间格式的字节码,然后由Java虚拟机...
- 命名规范:遵循驼峰命名法,区分大小写,避免使用Java保留字,确保名称有意义且唯一。 - 运算符:包括算术运算符、比较运算符、逻辑运算符、位运算符、赋值运算符和三元运算符等。 7. Java其他基础知识 - 控制...
ReadAndWrite.java 读入和写出数据 ReadAndWriteFile.java 读入数据写出到文件 Student.java 定义一个用来序列化的类 ThreadIn.java 接收数据用的线程类 ThreadOut.java 发送数据用的线程类 TypeFile.java ...
标识符区分大小写,且不能使用Java关键字。 - **分隔符**:包括分号、大括号、中括号、小括号等,用于分隔不同的代码块和表达式。 - **注释**:单行注释(`//`)、多行注释(`/* */`)和文档注释(`/** */`),其中...
在Java编程语言中,字符串是极其重要的...总的来说,Java的字符串大小写转换功能是基础且实用的,是每个Java开发者必备的技能之一。通过深入理解和实践,你可以更好地驾驭这个强大的工具,提升代码的灵活性和可读性。
格式:javac 文件名.java(不区分大小写) * 使用 java 命令,运行 class 文件。格式:java 类名(区分大小写) 二、Java 基础知识 * 一个 JAVA 文件中可以有多个类。 * 一个 JAVA 文件中只能有一个公有(public)...
Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...
标识符由字母、数字、下划线(_)和美元符号($)组成,但不能以数字开头,不能与Java关键字冲突,且严格区分大小写。 Java中有五种基本数据类型,分别是整数型(如int、long)、小数型(如float、double)、布尔型...