2013-05-31 17 views
7

Sto cercando di sostituire un valore stringa java come segue. sotto il codice non funziona.Regex utilizzando Java String.replaceAll

 cleanInst.replaceAll("[<i>]", ""); 
     cleanInst.replaceAll("[</i>]", ""); 
     cleanInst.replaceAll("[//]", "/"); 
     cleanInst.replaceAll("[\bPhysics Dept.\b]", "Physics Department"); 
     cleanInst.replaceAll("[\b/n\b]", ";"); 
     cleanInst.replaceAll("[\bDEPT\b]", "The Department"); 
     cleanInst.replaceAll("[\bDEPT.\b]", "The Department"); 
     cleanInst.replaceAll("[\bThe Dept.\b]", "The Department"); 
     cleanInst.replaceAll("[\bthe dept.\b]", "The Department"); 
     cleanInst.replaceAll("[\bThe Dept\b]", "The Department"); 
     cleanInst.replaceAll("[\bthe dept\b]", "The Department"); 
     cleanInst.replaceAll("[\bDept.\b]", "The Department"); 
     cleanInst.replaceAll("[\bdept.\b]", "The Department"); 
     cleanInst.replaceAll("[\bdept\b]", "The Department"); 

Qual è il modo più semplice per ottenere la sostituzione di cui sopra?

+0

cosa intendi per non lavoro? – stinepike

+0

Rimuovi le parentesi quadre ('[' e ']'). Questi sono per classi di personaggi. Se qualcos'altro non funziona, dovrai essere più specifico. – iamnotmaynard

+0

Sei consapevole di ciò che una classe di caratteri è in un'espressione regolare? http://regex.info – fge

risposta

6
cleanInst.replaceAll("[<i>]", ""); 

dovrebbe essere:

cleanInst = cleanInst.replaceAll("[<i>]", ""); 

dal String classe è immutabile e non cambia il suo stato interno, vale a dire replaceAll() restituisce una nuova istanza che è diverso da cleanInst.

+2

Penso che questo sia lungi dall'essere il problema qui ... – fge

+1

@fge ... ma è uno di loro ... – iamnotmaynard

2

Si consiglia di leggere un codice base regular expressions tutorial.

Fino ad allora, quello che si è tentato di fare può essere fatto in questo modo:

cleanInst = cleanInst.replace("//", "/"); 
cleanInst = cleanInst.replaceAll("</?i>", ""); 
cleanInst = cleanInst.replaceAll("/n\\b", ";") 
cleanInst = cleanInst.replaceAll("\\bPhysics Dept\\.", "Physics Department"); 
cleanInst = cleanInst.replaceAll("(?i)\\b(?:the)?dept\\b\\.?", "The Department"); 

probabilmente si potrebbe incatenare tutti coloro sostituire le operazioni (ma non so la sintassi di Java appropriata per questo).

Informazioni su word boundaries: \b di solito ha senso solo prima o dopo un carattere alfanumerico.

Per esempio, \b/n\b corrisponderà solo /n se è direttamente preceduto da un carattere alfanumerico e seguito da un carattere non alfanumerico, in modo che corrisponda "a/n!" ma non "foo /n bar".

+1

+1 la tua risposta è abbastanza buona, ma perché il gruppo non catturante per "il"? È solo "prestazione"? La leggibilità di Cos IMHO diminuisce più degli aumenti delle prestazioni. A proposito, sospetto che '/ n' debba essere' \ n' – Bohemian

+1

Sono abituato a farlo in questo modo. Non uso mai le parentesi di cattura a meno che non voglia catturare un gruppo. Sono d'accordo che c'è tensione tra affermare chiaramente le proprie intenzioni e leggibilità. –

11

Se si tratta di una funzione che si utilizza continuamente, c'è un problema. Ogni espressione regolare viene nuovamente compilata per ogni chiamata. È meglio crearli come costanti. Potresti avere qualcosa di simile.

private static final Pattern[] patterns = { 
    Pattern.compile("</?i>"), 
    Pattern.compile("//"), 
    // Others 
}; 

private static final String[] replacements = { 
    "", 
    "/", 
    // Others 
}; 

public static String cleanString(String str) { 
    for (int i = 0; i < patterns.length; i++) { 
     str = patterns[i].matcher(str).replaceAll(replacements[i]); 
    } 
    return str; 
} 
+0

Invece di 'Pattern', ora abbiamo gli oggetti' Matcher' creati ogni volta. Come va meglio? – rpattabi

+0

Perché compilare un regex Pattern è più costoso rispetto alla creazione di un Matcher per un pattern (precompilato)? –