2

文字列に対して次の操作を実行しようとしています。

    if (combatLog.contains("//*name//*")) {
        combatLog.replaceAll("//*name//*",glad.target.name);
    }

スラッシュは、* なしでは機能しないため、* をエスケープするための私の試みです。また、スラッシュを 1 つ試してみました。ありがとう

4

4 に答える 4

7

replaceAll()(直観に反して) 文字列ではなく、正規表現を取ります。正規表現の文字をエスケープするには、二重のバック
スラッシュ が必要です(文字列リテラルからバックスラッシュをエスケープするために二重にします)。

ただし、正規表現は必要ありません。代わりに単に呼び出すreplace()必要があり、エスケープは必要ありません。

于 2013-06-27T20:04:41.120 に答える
5

スラッシュを使用しています。バックスラッシュはエスケープ文字です。*さらに、文字列が正規表現などに使用されていない限り、エスケープする必要はありません/

fighterLog が String の場合、contains メソッドは一連の文字のみをチェックします。文字列を探している場合は*name*、 call だけが必要ですcombatLog.contains("*name*")

于 2013-06-27T20:04:31.507 に答える
4

スラッシュを使用している場合はバックスラッシュを使用します:\文字をエスケープするには

replace()[編集] また、正規表現ではなく文字列を入力として受け入れるものを使用する必要があるとスラックスが言ったように。

于 2013-06-27T20:04:27.850 に答える
3

文字列の不変性を忘れずに、新しく作成された文字列を再割り当てしてください。また、ifブロックにこれ以上コードが含まれていない場合、ifチェックはまったく必要ありません。

次の 3 つのオプションがあります。

if (combatLog.contains("*name*")) { // don't escape in contains()
    combatLog = combatLog.replaceAll("\\*name\\*", replacement);// correct escape
}
// another regex based solution
if (combatLog.contains("*name*")) {
    combatLog = combatLog.replaceAll("[*]name[*]", replacement);// character class
}

または正規表現なし

if (combatLog.contains("*name*")) {
    combatLog = combatLog.replace("*name*", replacement);// literal string
}
于 2013-06-27T20:09:40.457 に答える