Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java CQEngine字符串查询实现_Java_Regex - Fatal编程技术网

Java CQEngine字符串查询实现

Java CQEngine字符串查询实现,java,regex,Java,Regex,CQEngine查询字符串,例如StringEndsWith、StringContains。。。您是否知道为什么不使用正则表达式来进行匹配操作? 我认为这是出于性能目的,但我并不清楚它是否会优于正则表达式实现 示例StringEndsWith: @Override boolean matchesSimpleAttribute(SimpleAttribute<O, A> attribute, O object) { CharSequence attributeValue = a

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;
}
@覆盖
布尔匹配SimpleAttribute(SimpleAttribute属性,O对象){
CharSequence attributeValue=attribute.getValue(对象);
返回containsFragment(attributeValue,value);
}
@凌驾
布尔匹配非简单属性(属性,O对象){
for(attributeValue:attribute.getValues(对象)){
if(包含片段(attributeValue,value)){
返回true;
}
}
返回false;
}
静态布尔containsFragment(CharSequence文档,CharSequence片段){
final int documentLength=document.length();
final int fragmentLength=fragment.length();
最终int LASTSTARTOFSET=文件长度-碎片长度;

对于(int startOffset=0;startOffset而言,针对特定函数的优化比针对一般函数的优化更容易

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

那么您认为什么更快呢?直接编译成字节/机器码的stringEndWith还是正则表达式“$”哪一个首先需要编译成表达式树,然后需要遍历以匹配字符串末尾的字符串?在最好的情况下,理论多于实践,编译后的正则表达式将与stringEndsWith函数的匹配速度一样快。这意味着编译步骤仍在减慢程序的速度

希望这能把事情弄清楚