2010-10-28 20 views
7

ho questo regex che si suppone per rimuovere delimitatori di frasi (. e ?):regex Java semplice non funziona

sentence = sentence.replaceAll("\\.|\\?$",""); 

Funziona bene converte

"I am Java developer." a "I am Java developer"

"Am I a Java developer?" a "Am I a Java developer"

Ma dopo l'implementazione w e ha scoperto che sostituisce anche tutti gli altri punti nella frase come

"Hi.Am I a Java developer?" diventa "HiAm I a Java developer"

Perché succede questo?

risposta

14

Il pipe (|) ha la precedenza più bassa di tutti gli operatori. Così il vostro regex:

\\.|\\?$ 

viene trattato come:

(\\.)|(\\?$) 

che corrisponde a un .ovunque nella stringa e corrisponde a un ? alla fine della stringa.

Per risolvere questo problema è necessario al gruppo . e ? insieme come:

(?:\\.|\\?)$ 

Si potrebbe anche usare:

[.?]$ 

All'interno di una classe di caratteri . e ? sono trattati letteralmente quindi è necessario non sfuggirli

+0

Grazie per la chiara spiegazione. Ora funziona. – user489849

+1

+1 Bella spiegazione. – jensgram

+1

Quando ringrazi qualcuno, controlla la sua risposta come utile, è un minimo ;-). +1 per la spiegazione dettagliata –

3

Hai dimenticato di abbracciare i personaggi frase-termina con parentesi tonde:

sentence = sentence.replaceAll("(\\.|\\?)$",""); 

L'approccio migliore è quello di utilizzare [.?]$ come @ Mark Byers suggerito.

sentence = sentence.replaceAll("[.?]$",""); 
7

Il tuo problema è dovuto al basso precedence del alternation operator|. La vostra espressione regolare significa partita uno dei:

  • . ovunque o
  • ? alla fine di una riga.

Utilizzare una classe di caratteri, invece:

"[.?]$" 
8

Quello che stai dicendo con "\\.|\\?$" è "sia un periodo di" o "un punto interrogativo come ultimo carattere".

Suggerirei invece "[.?]$" al fine di evitare l'evasione confusa (e il risultato indesiderato, ovviamente).

+0

Non è l'unico con questa idea, sembra :) – jensgram

+1

+1 per allineare i punteggi con Mark Byers poiché sono le stesse risposte: p –