想法由来:之前写读书报告时,遇到一些烦人的文献,总喜欢把注释作为括号内容放到正文中,使文章繁琐冗长,所以写了下面这个代码,剔除了括号内的内容。
适用条件:原txt文本中的括号使用正确,即左右括号匹配正确,且对应的一对左右括号之间不能换行。
主要思想:以段落作为处理对象,找到第一个左括号的位置后,定义一个计数器count赋初值为1,然后遍历该左括号之后的字符,若遇到左括号则count加1,若遇到右括号则count减1。当count的值为0时,说明左右括号匹配正确,已经找到了与第一个左括号对应的右括号,此时就将这两个括号之间的内容以及括号替换成“”(空内容),然后再找寻该段落中的下一个左括号,并将count的值置为1,循环执行上述过程,将所有括号内内容删去。
源代码:
import java.io.*; import java.util.*; public class FileReader { public static String replace(String str) //识别括号并将括号内容替换的函数 { int head = str.indexOf('('); //标记第一个使用左括号的位置 if(head==-1); //如果str中不存在括号,什么也不做,直接跑到函数底端返回初值str else{ int next=head+1; //从head+1起检查每个字符 int count=1; //记录括号情况 do{ if(str.charAt(next)=='(') count++; else if(str.charAt(next)==')') count--; next++; //更新即将读取的下一个字符的位置 if(count==0) //已经找到匹配的括号 { String temp = str.substring(head,next); //将两括号之间的内容及括号提取到temp中 str = str.replace(temp, ""); //用空内容替换,复制给str head = str.indexOf('('); //找寻下一个左括号 next=head+1; //标记下一个左括号后的字符位置 count=1; //count的值还原成1 } }while(head!=-1); //如果在该段落中找不到左括号了,就终止循环 } return str; //返回更新后的str } public static void main(String[] args) throws FileNotFoundException, Exception { Scanner in = new Scanner(new File("C:\Users\kid\Desktop\input.txt")); //读取该地址下的input.txt文件 PrintWriter out = new PrintWriter(new File("C:\Users\kid\Desktop\output.txt")); //将处理后的文件output.txt创建到该地址下 while(in.hasNext()){ String str = in.nextLine(); //按行读取,遇到换行符停止。将读取到的内容赋值到str中 str = str.replace('(', '('); str = str.replace(')', ')'); //考虑到某些文献中输入法混用,统一将中文输入法下的括号--‘(’、‘)’替换成英文输入法下的括号--‘(’、‘)’,便于之后的处理 out.write(replace(str)+" "); //写出文本并换行 } out.close(); //关闭写入的文本 } }