2013-12-08 34 views
0

CQEngine查询字符串的实例StringEndsWith,StringContains ...正在使用迭代算法进行匹配操作你有一个想法,为什么它不是用正则表达式来完成的吗? 我认为它是出于性能目的,但它对我来说不会超越正则表达式的实现。CQEngine字符串查询实现

例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; 
} 

谢谢您的回答。

回答

0

对于特定功能而非通用功能进行优化比较容易。

正则表达式匹配通常分两个阶段执行:编译正则表达式和匹配自身。编译将正则表达式转换为表达式树。在编译期间,正则表达式的每个字符都与正则表达式的特殊字符的全部范围匹配。编译完成后,可以通过遍历表达式树来匹配一个字符串,而不必每次重新解释整个正则表达式。

那么你认为更快?一个stringEndWith直接编译为字节/机器代码或正则表达式“< string> $”,它首先需要被编译到一个表达式树中,然后需要将其与字符串结尾处的字符串进行匹配?在最好的情况下,这比理论更理论化,编译的正则表达式将匹配与stringEndsWith函数一样快的速度。这意味着编译步骤仍然会减慢你的程序。

希望这个清楚的事情。