Caratteri ottimali Escaper vs Matcher / Pattern

2

Devo sfuggire ai caratteri speciali inviati a Apache Lucene .

Poiché il codice verrà eseguito su un server di produzione, voglio che il codice sia il più veloce possibile.

Ho visto diversi modi per farlo:

  • Uso di Pattern
  • Uso di Sostituisci
  • Uso della libreria

Vedi: link

Mi chiedo:

  • Per casi banali come questo, dovrei usare RegEx o personalizzato?
  • Il seguente codice può essere ulteriormente ottimizzato?

    /*
     * Lucene supports escaping special characters that are part of the
     * query syntax. The current list special characters are + - && || !
     * ( ) { } [ ] ^ " ~ * ? : \
     * 
     * To escape these character use the \ before the character.
     */
    String query = "http://This+*is||a&&test(whatever!!!!!!)";
    char[] queryCharArray = new char[query.length()*2];
    char c;
    int length = query.length();
    int currentIndex = 0;
    for (int i = 0; i < length; i++) 
    {
        c = query.charAt(i);
        switch (c) {                
        case ':':
        case '\':
        case '?':
        case '+':
        case '-':
        case '!':
        case '(':
        case ')':
        case '{':
        case '}':
        case '[':
        case ']':
        case '^':
        case '"':
        case '~':
        case '*':
            queryCharArray[currentIndex++] = '\'; 
            queryCharArray[currentIndex++] = c; 
        break;
    
        case '&':
        case '|':   
            if(i+1 < length && query.charAt(i+1) == c)
            {
                queryCharArray[currentIndex++] = '\'; 
                queryCharArray[currentIndex++] = c; 
                queryCharArray[currentIndex++] = c; 
                i++;
            }
        break;
    
        default:
            queryCharArray[currentIndex++] = c;     
    
        }
    
    }
    
    query = new String(queryCharArray,0,currentIndex);
    
    System.out.println("TEST="+query);
    
posta Menelaos Bakopoulos 23.09.2013 - 11:53
fonte

1 risposta

1

Vorrei usare un boolean[65536] che contrassegna se il personaggio deve essere sfuggito. Sono abbastanza sicuro che sia più veloce di switch .

Ma solo la profilazione può mostrare se è molto più veloce.

String query = "http://This+*is||a&&test(whatever!!!!!!)";
char[] queryCharArray = new char[query.length()*2];
char c;
int length = query.length();
int currentIndex = 0;
for (int i = 0; i < length; i++) 
{
    c = query.charAt(i);
    if(mustBeEscaped[c]){        
      if('&'==c || '|'==c){
        if(i+1 < length && query.charAt(i+1) == c){
            queryCharArray[currentIndex++] = '\'; 
            queryCharArray[currentIndex++] = c; 
            queryCharArray[currentIndex++] = c; 
            i++;
        }
      }    
      else{
        queryCharArray[currentIndex++] = '\'; 
        queryCharArray[currentIndex++] = c; 
      }     
    }
    else{
        queryCharArray[currentIndex++] = c;     
    }
}

query = new String(queryCharArray,0,currentIndex);

System.out.println("TEST="+query);
private static final boolean[] mustBeEscaped = new boolean[65536];
static{
mustBeEscaped[':']=  //
  for(char c: "\?+-!(){}[]^\"~*&|".toCharArray()){
     mustBeEscaped[c]=true; 
  }
}
    
risposta data 23.09.2013 - 12:17
fonte

Leggi altre domande sui tag