package com.tang; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; public class ParseSource { public static boolean inMethod = false; public static int braces = 0 ; // 名字,模板,类型的正则 public static String namePattern = "[_a-zA-Z]+\w*"; public static String templatePattern = "(<[_a-zA-Z]+\w*(, [_a-zA-Z]+\w*)*>)?"; public static String typePattern = namePattern + templatePattern + "(\[\]){0,2}"; // 参数的正则 public static String argPatternZero = "\s*"; // 无参数 public static String argPatternSingle = typePattern + "\s+" + namePattern; public static String argPatternDynamic = typePattern + "\s*" + "\.\.\." + "\s*" + namePattern; // 动态参数 public static String argPattern = argPatternSingle+ "(\s*,\s*" + argPatternSingle + ")*" + "(\s*,\s*" + argPatternDynamic + ")?"; //多个参数 + 动态参数 public static String argsPattern = "(" + argPatternZero + "|" + argPatternDynamic + "|" + argPattern + ")"; public static void main(String[] args) { String filePath = "G:\workspace2\JavaJFX\src\com\bowen\LocalVarTest.java"; parseFile(filePath); // String mSign = "public boolean skipTo(int a,Object...o) {"; // boolean b = isMethod(mSign); // System.out.println(b); } private static void parseFile(String filePath) { if(filePath == null || "".equals(filePath)) return; File file = new File(filePath); if(!file.exists()) return; BufferedReader reader = null; PrintWriter writer = null; String pathname = "C:\LocalVarTest.java"; String rBrace = "\s*\)?\s*\{"; String rLocalVar = "\s*" + argPatternSingle + "\s*" + ";"; //String rLocalVarV = argPatternSingle + "\s+" + "="; try { reader = new BufferedReader(new InputStreamReader(new FileInputStream(file))); writer = new PrintWriter(new File(pathname)); byte[] b = new byte[8192]; String buffer; while((buffer = reader.readLine()) != null){ if(isMethod(buffer)){ inMethod = true; System.out.println(buffer); if(buffer.indexOf('{') != -1) braces++; writer.write(buffer); writer.println(); continue; } if(inMethod){ if(buffer.indexOf('{') != -1){ braces++; } if(buffer.indexOf('}') != -1){ braces--; } if(braces == 0) inMethod = false; if(buffer.matches(rLocalVar)){ int pos = buffer.indexOf(';'); if(buffer.indexOf("int") != -1 || buffer.indexOf("short") != -1 || buffer.indexOf("byte") != -1 || buffer.indexOf("long") != -1){ buffer = buffer.substring(0, pos) + " = 0;"; } else if(buffer.indexOf("float") != -1 || buffer.indexOf("double") != -1){ buffer = buffer.substring(0, pos) + " = 0.0;"; } else if(buffer.contains("boolean")){ buffer = buffer.substring(0, pos) + " = false;"; } else if(buffer.contains("char")){ buffer = buffer.substring(0, pos) + " = \' \' ;"; } else { buffer = buffer.substring(0, pos) + " = null;"; } } } writer.write(buffer); writer.println(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if(reader != null){ try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } if(writer != null){ writer.close(); } } } public static boolean isMethod(String mSign){ boolean b = false; // 方法签名的正则 String methodSignaturePattern = "\s*((public|protected|private)\s)?\s*(\s*static\s+)?(\s*final\s+)?" + typePattern + "\s+" + namePattern + "\s*\(\s*" + argsPattern + "\s*\)" + "\s*(\{)?"; // System.out.println(methodSignaturePattern); b = mSign.matches(methodSignaturePattern); return b; } }