8

次のように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");

上記の置換を実現する最も簡単な方法は何ですか?

4

3 に答える 3

14

継続して使用している機能である場合は、問題があります。各正規表現は、呼び出しごとに再度コンパイルされます。それらを定数として作成することをお勧めします。あなたはこのようなものを持つことができます。

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;
}
于 2013-05-31T21:53:41.487 に答える
8
cleanInst.replaceAll("[<i>]", "");

次のようにする必要があります。

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

クラスは不変であり、Stringその内部状態を変更しないため、つまり、 とはreplaceAll()異なる新しいインスタンスを返しますcleanInst

于 2013-05-31T21:14:28.590 に答える
3

基本的な正規表現のチュートリアルを読む必要があります。

それまでは、あなたがしようとしたことは次のように行うことができます:

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 構文はわかりません)。

単語の境界について:\b通常、英数字の直前または直後でのみ意味があります。

たとえば、は直前に英数字があり、その後に英数字以外の文字が続く場合に\b/n\bのみ一致するため、 には一致しますが、 には一致しません。/n"a/n!""foo /n bar"

于 2013-05-31T21:22:21.213 に答える