通过文字,我的意思是所有常量,如
这里10是整数文字,10.5f是浮动文字,Hello是字符串文字 但是在尝试了一些事情后,我在代码的某些部分取得了成功。
int a = 10;
float b = 10.5f;
String all = "Hello";
String s = "my source program that i am reading from file";
String lines[] = s.split("\n"); //Break my program into lines
for(int i=0;i<lines.length;i++) {
if(lines[i].contains("="))
System.err.println(lines[i].substring(lines[i].indexOf("=")+1),lines[i].indexOf(";"));
}
但它也为我提供了以下作业的输出: -
Myapp a=new Myapp();
但是我只需要找到文字
答案 0 :(得分:1)
虽然有更好的方法可以解决此问题,但现有代码的快速修复方法是进行小幅调整:
String s = "my source program that i am reading from file";
String lines[] = s.split("\n"); // Break my program into lines
for (int i = 0; i < lines.length; i++) {
if (lines[i].contains("=")) {
String literal = lines[i].substring((lines[i].indexOf("=") + 1), lines[i].indexOf(";"));
if (!literal.contains("new"))
System.err.println(literal);
}
}
答案 1 :(得分:1)
如果你真的想找到所有文字,请连接一个java解析器或使用“javap”工具查看生成的类文件。在包含以下行的代码上运行它:
int a = 20;
long b = 10L;
float c = 1.10E12f;
使用“grep”只选择那些描述long,float和String的行,返回
javap -c Main.class | grep -E "const|push|//" | grep -vE "Field|Method|class"
0: bipush 20
2: ldc2_w #2 // long 10l
6: ldc #4 // float 1.1E12f
这会找到所有文字。甚至那些内部字符串,隐式(i++
)或以某种方式引用。请注意,int
文字只能通过bipush
和iconst_*
指令找到,因为javap反编译器不会为它们生成注释。有关字节码和常量的更多信息here
如果您只对<atomicType> <identifier> = <literal>;
形式的简单行感兴趣,请使用正则表达式搜索它们:
String pattern =
"\\s*\\p{Alpha}[\\p{Alnum}_]*\\s+" + // type with space, eg.: "int "
"\\p{Alpha}[\\p{Alnum}_]*\\s*=\\s*" + // java identifier with =, eg.: "myVar ="
"(([-+]?\\s*\\d*\\.?\\d+([eE][-+]?\\d+)?[Lf]?)?|" + // numeric non-hex
"(\"[^\"]*\"))\\s*;"; // or unquoted string constant
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(input);
while (m.find()) {
String literal = m.group(1);
System.err.println(literal);
}