所以我现在已经有一段时间的问题,并且认为值得花时间去询问更有经验的正则表达式的人是否有办法通过快速搜索和替换解决这个问题。
所以我使用一个生成java代码的工具(不是用java编写的,或者我会直接手动修复原因),但是,在创建对象之前调用变量有一个问题。
每个对象只发生一次,但不是每个对象都发生,对象名称是未知的,并且错误始终是在调用构造函数之前的行。这是错误始终存在的格式:
this.unknownObjectName.mirror = true;
this.unknownObjectName = new Model(unknown, parameter, values);
我知道应该有一个解决这个问题的技巧,因为简单的字符串替换根本不起作用,因为'unknownObjectName'是未知的。
这是否可以使用正则表达式,如果是这样,请赐教:)
这就是代码应该如何阅读:
this.unknownObjectName = new Model(unknown, parameter, values);
this.unknownObjectName.mirror = true;
对于复杂模型,此错误可能会发生数百次,因此这确实可以节省大量时间。那个,我宁愿走在热煤上然后做无意识的繁忙工作,比如手动修理所有这些:)
编辑: 我通过一起完成这项工作的java应用程序。
public static void main(String args[]){
File file = new File(args[0]);
File file2 = new File(file.getParentFile(), "fixed-" + file.getName());
try {
if(file2.exists()) {
file2 = new File(file.getParentFile(), "fixed-" + System.currentTimeMillis() + "-" + file.getName());
}
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file2)));
String line, savedline = null, lastInitVar = "";
while((line = br.readLine()) != null){
if(line.contains("= new ")){
String varname = line.substring(0, line.indexOf("=")).trim();
lastInitVar = varname;
}else if(line.contains(".mirror")){
String varname = line.substring(0, line.indexOf(".mirror")).trim();
if(!lastInitVar.equals(varname)){
savedline = line;
continue;
}
}else if(savedline != null && savedline.contains(lastInitVar)){
bw.write(savedline + "\n");
savedline = null;
}
bw.write(line + "\n");
}
bw.flush();
bw.close();
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
答案 0 :(得分:0)
编写一个程序来逐行读取,当你在构造函数没有写出来之前看到一个对象访问时,写出下一行,然后写出缓冲行,冲洗重复。
有些人在遇到问题时会想“我知道,我会用 正则表达式。“现在他们有两个问题。 - Jamie Zawinski
Regular Expressions are for matching patterns not state based logic.