【问题标题】:Regex Matching in Java Performance ImprovementJava 性能改进中的正则表达式匹配
【发布时间】:2020-04-02 11:16:16
【问题描述】:

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

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() 中存在的正则表达式合并到一个合并的正则表达式中 最后,我正在为每个规则执行合并的正则表达式。

【问题讨论】:

  • 你能提供一个你输入的样本吗?
  • 这试图解决的总体问题是什么? 3-4分钟适用于搜索一个文本还是多个文本?
  • 看看Aho-Corasick algorithm。它专门用于同时定位输入文本中的多个字符串。

标签: java regex performance java-8


【解决方案1】:

我想这是一份非结构化文档。我看不到正则表达式的优化方法,而是文档的方法。

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

  • 坚持当前的解决方案,但稍微改变一下方法。如果结构允许,将文档分成块。与其在整个文档中,不如在较小的分区中执行多个目标搜索。好处还在于您可能会了解每个分区的预期内容,并且每个分区的正则表达式变得更小更快。
  • 索引文档并查找专门用于文本挖掘的工具。如果文档是从一些结构化数据(例如 XML)生成的,请改用这些数据。

【讨论】:

    猜你喜欢
    • 2011-03-30
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    相关资源
    最近更新 更多