java中类定义的正则表达式

时间:2009-08-11 03:40:14

标签: java regex sed awk gawk

问题如下:

Java中存在大量代码库(数十个包中有数百个文件),我们需要能够在每个类定义中添加和删除关键字strictfp。我打算使用sed或awk来执行此替换。但是,我想避免在评论或其他地方使用“类”这个词来替换。谁能想到解决方案?

8 个答案:

答案 0 :(得分:2)

对于这样的任务,我首先建议编写一个小程序来验证目录树中的所有*.class文件实际上(或没有)正确的strictfp设置。然后,无论你选择做什么来解决源代码修改问题,你都可以在编译器之后运行检查器,以确保你做对了。

这实际上只是TDD应用于您的特定问题。

答案 1 :(得分:1)

代码格式的标准是什么?例如,您是否可以在以{结尾的行中查找“class”,或者下一行以{开头还是某些内容?

答案 2 :(得分:1)

没有java解析器,无法确定100%正确。但是,以下内容可能足够接近:

sed -i.bak 's/\\(public\\|private\\|protected\\)\\(.*\\)class/\\1 strictfp \\2 class/g' $file

我认为我有正确的逃脱,但我是从Windows机器上写的,并没有测试过它。

如果您对“公共/私人/受保护”以及“课程”发表评论,上述情况将会绊倒。

答案 3 :(得分:1)

作为一个完整的全能,不,没有RegEx。您基本上需要编写Java解释器(或至少是解析器)以便考虑类的任何理论构造。话虽如此,如果单词class是该行上的第一个非空白位,或者如果它前面有一个访问修饰符,就是该行上的第一个非空白位,那么你真的应该是安全的。

答案 4 :(得分:1)

我可以想到两种可能性:

  • 使用解析器而不是正则表达式(RE不适用于所有内容)。解析器将更好地理解语言语法。
  • 使您的代码库保持一致,这样您就不会选择错误的“类”字符串。

这些都不是很令人满意。第一个实际上很难写,第二个很难做对。

我的建议是找到一个RE并在源代码的本地副本上将其松散,然后检查所有更改。无论错误发生了什么变化,都要调整RE并再试一次。

然后介绍编码标准,逐步改变所有不符合的定义是正确的。

答案 5 :(得分:1)

由于您希望在strictfp和no strictfp之间来回切换,因此在构建过程中修改.class文件可能更好。然后,您可以将此选项作为构建选项并在不经常更改源文件的情况下进行切换。

答案 6 :(得分:0)

Starblue:谢谢!从查找BCEL,我找到了JMangler,这是完美的,因为我可以修改现有的.class文件来添加strictfp修饰符。 http://javalab.cs.uni-bonn.de/research/jmangler/tutorial/using.html

答案 7 :(得分:0)

只是为了让人们知道,我决定最终选择Javassist而不是BCEL,因为Javassist似乎更容易使用,并且完全适合我的目的。 http://csg.is.titech.ac.jp/~chiba/javassist。 如果有人好奇,代码将会是这样的:


    import javassist.*;
    ClassPool cp = new ClassPool(); 
    CtClass someClass = cp.get("SomeClass"); 
    someClass.setModifiers(Modifier.STRICT);