java - 模式搜索性能差

标签 java performance pattern-matching

我正在使用正则表达式针对大小仅约 106 MB 的目录搜索非常具体的模式。大约需要 10 秒才能完成。

我可以做些什么来提高性能吗?

package com.JFileReader;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class FileData {

    public static void main(String[] args) {
        File dir = new File("/Users/me/Desktop/");

        if(dir.isFile()) { handleFile(dir); }
        if(dir.isDirectory()) { handleDir(dir); }
    }

    public static void handleFile(File aFile) {
        String regex = "[a-zA-Z]+[.][a-zA-Z]+[@][a-zA-Z]+[.][a-zA-Z]+";
        Pattern pattern = Pattern.compile(regex);

        try {
            BufferedReader br = new BufferedReader(new FileReader(aFile));
            Matcher m; 

            String line;
            while ((line = br.readLine()) != null) {
                m = pattern.matcher(line);
                if (m.find()) {
                    System.out.println("Found: " + aFile);
                }
            }
            br.close();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }

    public static void handleDir(File dir) {
        for (File file : dir.listFiles()) {
            if(file.isFile()) { handleFile(file); }
            if(file.isDirectory()) { handleDir(file); }
        }
    }
}

最佳答案

您可以使用所有格量词:

String regex = "[a-zA-Z]++\\.[a-zA-Z]++@[a-zA-Z]++\\.[a-zA-Z]++";

当您使用所有格量词时,正则表达式引擎不会记录回溯位置,并且在匹配失败时永远不会返回尝试其他可能性。

关于java - 模式搜索性能差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18168725/

相关文章:

arrays - F# 中两个数组的匹配元素

functional-programming - 解决脆弱模式匹配的建议

java - 如何从内部匿名类中寻址匿名类的实例?

java - 使用 Jersey 的客户端加密和服务器端解密不起作用

Java检查数组是否已满,并将不同数组的一部分复制到另一个数组

c - 我应该使用什么类型才能获得最快的计算速度?

基于 Java 的大容量交易 Web 应用程序

java - 模糊展开的 RecyclerView 项目的周围(模糊 RecyclerView 除了其中一项)

javascript - 当调用返回相同对象的函数时,无论是否作为构造函数调用,我是否应该使用 `new` ?

matlab - 如何使用第一列作为索引从单个矩阵创建矩阵数组?