2013-08-04 4 views
8

ho elenco di parole chiave inserite dall'utente e possono contiene i caratteri speciali come $, #, @, ^, &, eccJava espressioni regolari per Corrispondenza esatta della parola con caratteri speciali

Come per la mia esigenza quando mai ricevo elenco di messaggi di testo che è necessario cercare tutte le parole chiave in ogni messaggio.

Abbiamo bisogno di corrispondenza esatta parola chiave.

CASO 1: Parola chiave semplice - Simple Message

ho usato \b per abbinare parola chiave esatta e funziona bene.

public static void main(String[] args) { 
     String patternStr = "(?i)\\bHello\\b"; 

     Pattern pattern = Pattern.compile(patternStr); 

     List<String> strList = new ArrayList<String>(); 
     strList.add("HHello Message"); 
     strList.add("This is Hello Message "); 
     strList.add("Now Hellos again."); 

     for(String str : strList) { 
      Matcher matcher = pattern.matcher(str); 
      System.out.println(">> "+matcher.find()); 
     } 
    } 

USCITA come previsto

>> false 
>> true 
>> false 

CASO 2: Parola chiave semplice - Messaggio con Carattere speciale

Ora, se corro sopra lo stesso codice per seguire i messaggi allora non ha funzionato come previsto.

List<String> strList = new ArrayList<String>(); 
strList.add("#Hello Message"); 
strList.add("This is Hello Message "); 
strList.add("Now Hellos again."); 

USCITA:

true 
true 
false 

risultati attesi

false 
true 
false 

CASO 3: Parola chiave & messaggio con caratteri speciali

Se ricevo i seguenti messaggi e la parola chiave è #Hello. Ho scritto il seguente codice ma lo non ha funzionato.

public static void main(String[] args) { 
     String patternStr = "(?i)\\b#Hello\\b"; 

     Pattern pattern = Pattern.compile(patternStr); 

     List<String> strList = new ArrayList<String>(); 
     strList.add("HHello Message"); 
     strList.add("This is #Hello Message "); 
     strList.add("Now Hellos again."); 

     for(String str : strList) { 
      Matcher matcher = pattern.matcher(str); 
      System.out.println(">> "+matcher.find()); 
     } 
    } 

USCITA:

>> false 
>> false 
>> false 

risultato atteso:

>> false 
>> true 
>> false 

Come posso sfuggire i caratteri speciali e risolvere CASE 2 and CASE 3.

Per favore aiuto.

+1

Un limite di parole non significa un limite di spazio. Questo è dove sei confuso. – tchrist

risposta

3

Il caso 2 sembra il contrario del caso 3, quindi non penso che sia possibile combinare lo Pattern s.

Per il caso 2, il vostro Pattern potrebbe essere simile:

Pattern pattern = Pattern.compile("(\\s|^)Hello(\\s|$)", Pattern.CASE_INSENSITIVE); 

In questo caso ci circondiamo la parola chiave da spazi o inizio/fine di ingresso.

Per il caso 3, il vostro Pattern potrebbe essere simile:

Pattern pattern = Pattern.compile("[\\$#@\\^&]Hello(\\s|$)", Pattern.CASE_INSENSITIVE); 

In questo caso, abbiamo precedere la parola chiave con uno qualsiasi dei caratteri speciali di vostra scelta (da notare le caratteri di escape riservata $ e ^), poi accettiamo gli spazi bianchi o la fine dell'input come il carattere che segue la parola chiave.

+0

Ho combinato entrambi i pattern come sotto Pattern.compile ("(\\ s | ^)" + Pattern.quote (frase) + "(\\ s | $)", Pattern.CASE_INSENSITIVE); e ha funzionato !!! –

2

Usa (?:^|\s) ("all'inizio del testo o spazi bianchi") al posto del primo \b, e (?:$|\s) ("fine del testo o spazi bianchi") al posto della seconda \b nella vostra regex.

+0

Grazie per la spiegazione –

1

Il problema deriva dal modo in cui è definita la "parola esatta". Non è solo lo spazio bianco che può circondare la parola per farne una parola. Ad esempio, nella maggior parte delle circostanze si vorrebbe una corrispondenza esatta di parole con cui "Ciao" deve lavorare.

"ciao", "quel ragazzo ha appena salutato quell'altro giovane" e "vorrei che la gente rispondesse al telefono dicendo ah piuttosto che ciao".

Se si desidera che la partita venga divisa solo in spazi vuoti, credo che sarà necessario specificare la condizione dello spazio bianco. Supponendo che tu voglia farlo coincidere alla fine, ti proporrei qualcosa di simile.

Pattern pattern = Pattern.compile("\(^\| \)" + escapeSearchString(patternString) + "\(\|$\)"); 

e poi avere un paio di metodi come questo

public String escapeSearchString(String patternString) { 
    StringBuilder stringBuilder = new StringBuilder(patternString.length() * 3); 
    for (char c : patternString.toCharArray()) { 
     if (isEscapableCharacter(c)) { 
      stringBuilder.append("\\"); 
     } 
     stringBuilder.append(c); 
    } 
} 

public boolean isEscapableCharacter(char c) { 
    switch (c) { 
     case '#': 
     case '$': 
     case '@': 
     case '^': 
     case '&': 
      return true; 
     default: 
      return false; 
    } 
} 

Probabilmente sarebbe meglio per iterare su un char [] per i personaggi eludibile e caricarli da un file di configurazione.

1

Prova forse in questo modo

String patternStr = "(?i)(?<=\\s|^)"+Pattern.quote(searchedStubstring)+"(?=\\s|$)"; 

(? < = ...) e (? = ...) è positivo look behind and ahead quindi controllerà se prima searchedStubstring avrà

  • white-space \\s o l'inizio dell'input ^ prima e
  • white-space \\s o la fine dell'input & dopo di esso.

Anche nel caso in cui si desidera cercato caratteri speciali come $+ e altri possono essere sfuggire loro.Per fare questo è possibile utilizzare Pattern.quote(searchedStubstring)

0

ad esempio, se la tua parola vuole avere carattere speciale (per esempio qui '#') all'inizio e alla fine di questo si deve scrivere il seguente:

Pattern p = Pattern.compile("(\\s|^|#)"+word+"(\\s|\\#|$)", Pattern.CASE_INSENSITIVE); 

se vuoi una corrispondenza esatta:

Pattern p = Pattern.compile("(\\s|^)"+word+"(\\s|$)", Pattern.CASE_INSENSITIVE); 

con '|' è come O in modo da poter aggiungere come partita speciale char di desideri esempio ..per:

Pattern p = Pattern.compile("(\\s|^|#|:|-)"+word+"(\\s|\\#|\\,|\\.|$)", Pattern.CASE_INSENSITIVE); 

char '^' significa per rilevare la stringa all'inizio della riga e '$' significa alla fine della riga. vedere di più qui: Summary of regular-expression constructs

Problemi correlati