article表示Java中的正则表达式匹配很慢,因为带有“反向引用”的正则表达式无法有效地匹配。本文介绍了基于Thomson基于NFA的高效匹配算法(于1968年发明),该算法适用于不带“反向引用”的正则表达式。但是Pattern javadoc说Java正则表达式使用基于NFA的方法。

现在,我想知道Java正则表达式匹配的效率如何以及它使用什么算法。

最佳答案

java.util.regex.Pattern使用Boyer–Moore字符串搜索算法

/* Attempts to match a slice in the input using the Boyer-Moore string
 * matching algorithm. The algorithm is based on the idea that the
 * pattern can be shifted farther ahead in the search text if it is
 * matched right to left.
 */

private void compile() {
    ----------------------
    -----------------------

   if (matchRoot instanceof Slice) {
        root = BnM.optimize(matchRoot);
        if (root == matchRoot) {
            root = hasSupplementary ? new StartS(matchRoot) : new Start(matchRoot);
        }
    } else if (matchRoot instanceof Begin || matchRoot instanceof First) {
        root = matchRoot;
    } else {
        root = hasSupplementary ? new StartS(matchRoot) : new Start(matchRoot);
    }
}

08-27 14:06