我正在研究一个项目,该项目将通过Java文件查找特定的方法,并将该方法占用的行输出到文件中。我已经在使用模式和匹配器来找到方法,但是随后我在一行中的字符之间进行迭代以找到匹配的花括号。
我的问题是,使用另一个Pattern / Matcher查找花括号对会更有效吗?
如果有帮助,可以在这里找到该方法的行范围:
String line;
int currentLineNumber = 0;
int methodStart = 0;
int methodEnd = 0;
int braceCount = 0;
Matcher matcher;
while ((line = lineReader.readLine()) != null) { // Must set line's value here because readLine() increments line number
currentLineNumber = lineReader.getLineNumber();
matcher = p.matcher(line); // initialize matcher with Pattern
if (matcher.find()) { // if the line has a regex hit, store the line number as currentLine
methodStart = currentLineNumber;
}
if (currentLineNumber >= methodStart && methodStart != 0) { // make sure that we've found the method
for (int i = 0; i < line.length(); i++) { // iterates through characters in the line
/*
* Start with a braceCount of 0. When you find a starting brace, increment.
* When you find an ending brace, decrement. When braceCount reaches 0 again,
* you will know that you have reached the end of the method.
*
* Could possibly reduce complexity/increase efficiency by using set of patterns/matchers
* to find braces.
*/
if (line.charAt(i) == '{')
braceCount++;
if (line.charAt(i) == '}') {
braceCount--;
if (braceCount == 0) {
methodEnd = currentLineNumber;
return new int[] { methodStart, methodEnd };
}
}
}
}
}
答案 0 :(得分:3)
在您的特定情况下可能不会。
您依次扫描Java String
一次。这比构建Matcher
然后使用它执行相同操作要快。 Matcher
也将必须至少扫描String
一次,其中没有任何魔法。
无论如何,在进行与性能相关的优化之前,请始终使用 profiler (例如VisualVM)。
首先,使用正则表达式解析Java可能是一个更大的问题。这样的解决方案不可避免地脆弱(例如,可以在一行上编写Java方法,可以有嵌套的类,泛型等)。
有许多Java parsers可以以更强大的方式完成这项工作。
答案 1 :(得分:1)
几乎可以肯定,是
为什么
1)您已经在逐行进行正则表达式。因此,正则表达式已经在逐个扫描整个文件。
2)请记住,字符串在Java中是不可变的,所以
while ((line = lineReader.readLine()) != null)
每行创建一个新的字符串对象。还应考虑readline不会加载到整个文件中,然后一次将其交给您一行。您可能会看到一些速度增强功能,即使不添加正则表达式也可以一次读取文件,然后逐行解析文件。
注意:读取整个文件可能不可行。如果是这样,请忽略上面的内容。