Java文字列値を次のように置き換えます。以下のコードは機能しません。
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");
上記の置き換えを達成する最も簡単な方法は何ですか?
継続的に使用している機能であれば問題があります。各正規表現は、呼び出しごとに再度コンパイルされます。定数として作成するのが最善です。あなたはこのようなものを持つことができます。
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;
}
_cleanInst.replaceAll("[<i>]", "");
_
でなければなりません:
_cleanInst = cleanInst.replaceAll("[<i>]", "");
_
String
クラスは不変であり、その内部状態を変更しないため、replaceAll()
はcleanInst
とは異なる新しいインスタンスを返します。
基本的な 正規表現のチュートリアル をお読みください。
それまでは、あなたがやろうとしたことは次のように行うことができます:
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");
おそらくこれらすべての置換操作を連鎖させることができます(ただし、適切なJava構文についてはこれがわかりません)。
Word境界 について:\b
は通常、英数字の直前または直後にのみ意味があります。
たとえば、\b/n\b
は/n
にのみ一致します。これは、英数字の直後に英数字以外の文字が続く場合にのみ一致するため、"a/n!"
には一致しますが、"foo /n bar"
には一致しません。