1

パターンの置き換えで奇妙な問題が発生しています。

私には次の2つのパターンがあります。

private static final Pattern CODE_ANY = Pattern.compile("&[0-9a-fk-or]");
private static final Pattern CODE_BLACK = Pattern.compile(ChatColour.BLACK.toString());

ChatColour.BLACK.toString()は「&0」を返します

次に、私はこのコードを持っています:

public static String Strip(String message)
{
    while (true)
    {
        Matcher matcher = CODE_ANY.matcher(message);
        if (!matcher.matches())
            break;
        message = matcher.replaceAll("");
    }
    return message;
}

私はいくつかの異なるアプローチを試しましたが、何も置き換えられません。初期バージョンでは、各CODE_xxxパターンが次々と呼び出されていましたが、ユーザーはアンパサンドを2倍にすることでそれを回避していました。

なぜこれが何も削除されないのか理解できません。コンソールにデバッグメッセージを出力して確認したので、確実に呼び出されていることはわかっています。

//モーテン

4

1 に答える 1

4

matches()完全な入力文字列がパターンと一致find()するかどうかをチェックし、パターンが入力文字列のどこかにあるかどうかをチェックします。そのため、メソッドを次のように書き直します。

public static String strip(String message) // lowercase strip due to Java naming conventions
{
    Matcher matcher = CODE_ANY.matcher(message);
    if (matcher.find())
        message = matcher.replaceAll("");
    return message;
}

気付いたばかりですが、これは1つのライナーで実行できます。

public static String strip(String message) {
    return message.replaceAll("&[0-9a-fk-or]", "");
}

このreplaceAll()メソッドを使用すると、プリコンパイルされたパターンは必要ありませんが、正規表現を文字列型の最終フィールドに抽出できます。

于 2013-03-24T21:18:02.713 に答える