CQEngine String Query实现

时间:2013-12-08 12:14:20

标签: java regex

对String的CQEngine查询实例StringEndsWith,StringContains ...正在使用迭代算法进行匹配操作你是否知道为什么不用正则表达式来代替? 我认为这是出于性能目的,但对我而言,它的性能将超过正则表达式。

示例StringEndsWith:

@Override
boolean matchesSimpleAttribute(SimpleAttribute<O, A> attribute, O object) {
    CharSequence attributeValue = attribute.getValue(object);
    return containsFragment(attributeValue, value);
}

@Override
boolean matchesNonSimpleAttribute(Attribute<O, A> attribute, O object) {
    for (A attributeValue : attribute.getValues(object)) {
        if (containsFragment(attributeValue, value)) {
            return true;
        }
    }
    return false;
}

static boolean containsFragment(CharSequence document, CharSequence fragment) {
    final int documentLength = document.length();
    final int fragmentLength = fragment.length();
    final int lastStartOffset = documentLength - fragmentLength;
    for (int startOffset = 0; startOffset <= lastStartOffset; startOffset++) {
        int charsMatched = 0;
        for (int endOffset = startOffset, j = 0; j < fragmentLength; j++, endOffset++) {
            char documentChar = document.charAt(endOffset);
            char fragmentChar = fragment.charAt(j);
            if (documentChar != fragmentChar) {
                break; // break inner loop
            }
            charsMatched++;
        }
        if (charsMatched == fragmentLength) {
            return true;
        }
    }
    return false;
}

感谢您的回答。

1 个答案:

答案 0 :(得分:0)

针对特定功能优化比通用功能更容易。

正则表达式匹配通常分两个阶段进行:正则表达式的编译和匹配本身。编译将正则表达式转换为表达式树。在编译期间,正则表达式的每个字符与全部正则表达式特殊字符匹配。编译后,可以遍历表达式树以匹配字符串,而无需每次都重新解释整个正则表达式。

那你认为什么更快? stringEndWith直接编译为字节/机器代码或正则表达式“&lt; string&gt; $”,首先需要将其编译成表达式树,然后需要将其移动以匹配字符串末尾的字符串?在最好的情况下,理论上比实践更多,编译的正则表达式将与stringEndsWith函数一样快。这意味着编译步骤仍然会减慢您的程序速度。

希望这清楚。