2013-05-31 12 views
7

Ich suche einen Java-String-Wert wie folgt zu ersetzen. unter Code funktioniert nicht.Regex mit 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"); 

Was ist der einfachste Weg, um das obige zu ersetzen?

+0

was meinst du mit nicht funktioniert? – stinepike

+0

Entfernen Sie die eckigen Klammern ('[' und ']'). Dies sind für Charakterklassen. Wenn etwas anderes nicht funktioniert, müssen Sie genauer sein. – iamnotmaynard

+0

Wissen Sie, was eine Zeichenklasse in einer Regex ist? http://regex.info – fge

Antwort

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

sollte sein:

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

seit String Klasse unveränderlich ist und seinen internen Zustand nicht, das heißt ändern replaceAll() eine neue Instanz zurückgibt, die von cleanInst anders.

+2

Ich denke, das ist bei weitem nicht das Problem hier ... – fge

+1

@fge ... aber es ist einer von ihnen ... – iamnotmaynard

2

Sie sollten eine grundlegende regular expressions tutorial lesen.

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"); 

Sie könnten wahrscheinlich alle, die Operationen ersetzen Kette (aber ich weiß nicht, die richtige Java-Syntax für diese):

Bis dahin, was Sie versucht, so zu tun, kann getan werden.

Über die word boundaries: \b macht normalerweise nur direkt vor oder nach einem alphanumerischen Zeichen Sinn.

Zum Beispiel \b/n\b nur /n übereinstimmen, wenn sie direkt von einem alphanumerischen Zeichen vorangestellt ist und von einem nicht-alphanumerischen Zeichen folgt, so dass es passt "a/n!" aber nicht "foo /n bar".

+1

+1 Ihre Antwort ist ziemlich gut, aber warum die nicht einfangende Gruppe für "die"? Ist es nur "Leistung"? Cos IMHO Lesbarkeit sinkt mehr als die Leistung erhöht. Btw: Ich vermute, '/ n' soll' \ n' sein. – Bohemian

+1

Ich bin es einfach so gewöhnt. Ich verwende niemals einfangende Klammern, es sei denn, ich möchte eine Gruppe erfassen. Ich stimme zu, dass es Spannungen gibt, wenn man seine Absichten klar und verständlich formuliert. –

11

Wenn es sich um eine Funktion handelt, die Sie ständig verwenden, liegt ein Problem vor. Jeder reguläre Ausdruck wird für jeden Aufruf erneut kompiliert. Es ist am besten, sie als Konstanten zu erstellen. Du könntest so etwas haben.

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

Statt 'Pattern' haben wir jetzt jedes Mal' Matcher' Objekte erstellt. Wie ist das besser? – rpattabi

+0

Weil das Erstellen eines Regex-Patterns teurer ist als das Erstellen eines Matcher für ein (vorkompiliertes) Pattern? –