java - Java 性能改进中的正则表达式匹配

标签 java regex performance java-8

我正在尝试匹配多行文本上的大正则表达式。某些正则表达式的执行时间大约需要 3-4 分钟。这基本上会导致性能问题 代码片段

boolean matchedRegex = false;

for (Rules rule : rules) {
    String mergedRegex = rule.getRegexes().stream().collect(Collectors.joining("|"));
    final Pattern pattern = Pattern.compile(mergedRegex, Pattern.MULTILINE | Pattern.DOTALL);
    System.out.println(String.format("Pattern: %s", pattern));
    if (pattern.matcher(text).find()) {
        matchedRegex = true;
        break;
    }
}
mergedRegex = "(?=.*MORTGAGE\b)(?=.* This Security Instrument is given to\b).*|(?=.*MORTGAGE\b)(?=.*Words used in multiple sections|WORDS USED OFTEN IN THIS DOCUMENT|The date of this Mortgage\b)(?=.*Security Instrument).*|(?=.*\bTHIS MORTGAGE made\b)(?=.*\bWITNESSETH\b).*|(?=.*\bMORTGAGE\b)(?=.*\bTHIS INDENTURE\b)(?=.*made the).*|(?=.*\bThis bond and mortgage\b)(?=.*\bmade the day of\b)(?=.*\bWitnesseth\b).*|(?=.*\bTHIS MORTGAGE\b)(?=.*\bis made this|is given on|is given to|by and between|is made on|entered into this\b).*|(?=.*\bCREDIT MORTGAGE\b)(?=.*Space Above This Line For Recording Data).*|(?=.*\bDOWN PAYMENT ASSISTANCE MORTGAGE\b)(?=.*THIS MORTGAGE).*|(?=.*\bSECURITY DEED\b)(?=.*\bWords used in multiple sections\b)(?=.*Security Instrument).*|(?=.*DOWN PAYMENT ASSISTANCE MORTGAGE\b)(?=.*\bmade and entered\b).*";

为了获得更好的性能,我可以在这里做的是将 rule.getRegexes() 中存在的正则表达式合并到一个合并的正则表达式中 最后,我为每个规则执行合并的正则表达式。

最佳答案

我认为这是一个非结构化文档。我没有看到任何优化正则表达式的方法,而是采用了文档的方法。

这取决于每个文档的规律性、预测性和结构化程度。有几种方法可以走:

  • 坚持当前的解决方案,但稍微改变一下方法。如果结构允许,请将文档拆分为多个 block 。而是在较小的分区中而不是在整个文档中执行多个有针对性的搜索。优点还在于,您可能会了解每个分区中的期望内容,并且每个分区的正则表达式变得更小、更快。
  • 为文档建立索引并查找专门用于文本挖掘的工具。如果文档是从某些结构化数据(例如 XML)生成的,请使用这些数据。

关于java - Java 性能改进中的正则表达式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60990290/

相关文章:

java - 错误: identifier expected in Java

java - 从类中调用方法时遇到问题

java - 从 SQLiteDB 获取选择信息?

javascript - 正则表达式错误 : Nothing to Repeat

regex - 如何让 vim 突出显示任何 { 后面没有 C++ 风格的注释或两个换行符?

REGEX - 将非字母数字符号的任意组合折叠为单个 "."

python - 如何从 OpenCV fitLine 计算残差?

mysql - 尝试根据其他列将几何对象添加到 MySQL 列导致 'no rows affected'?

mysql - 优化 select 中的派生表

java - visualvm 看不到从 cygwin 启动的 java 进程