使用模式/匹配器比遍历字符串和查找字符更有效吗?

时间:2019-03-13 19:28:23

标签: java regex performance iteration

我正在研究一个项目,该项目将通过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 };
                        }
                    }

                }

            }

        }

2 个答案:

答案 0 :(得分:3)

在您的特定情况下可能不会。

您依次扫描Java String一次。这比构建Matcher然后使用它执行相同操作要快。 Matcher也将必须至少扫描String一次,其中没有任何魔法。

无论如何,在进行与性能相关的优化之前,请始终使用 profiler (例如VisualVM)。


首先,使用正则表达式解析Java可能是一个更大的问题。这样的解决方案不可避免地脆弱(例如,可以在一行上编写Java方法,可以有嵌套的类,泛型等)。

有许多Java parsers可以以更强大的方式完成这项工作。

答案 1 :(得分:1)

几乎可以肯定,是

为什么

1)您已经在逐行进行正则表达式。因此,正则表达式已经在逐个扫描整个文件。

2)请记住,字符串在Java中是不可变的,所以

while ((line = lineReader.readLine()) != null)

每行创建一个新的字符串对象。还应考虑readline不会加载到整个文件中,然后一次将其交给您一行。您可能会看到一些速度增强功能,即使不添加正则表达式也可以一次读取文件,然后逐行解析文件。

注意:读取整个文件可能不可行。如果是这样,请忽略上面的内容。