2

我正在尝试对字符串执行以下操作。

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

斜线是我试图逃避 *,因为没有它们它就无法工作。我也尝试了一个斜线,并分别在 contains 或 replaceAll 上使用斜线。谢谢

4

4 回答 4

7

replaceAll()(反直觉地)采用正则表达式,而不是字符串。
要转义正则表达式的字符,您需要一个双反斜杠(加倍以从字符串文字中转义反斜杠)

但是,您不需要正则表达式。您应该简单地调用replace(),这不需要任何转义。

于 2013-06-27T20:04:41.120 回答
5

您正在使用正斜杠。反斜杠是转义字符。此外,除非字符串用于正则表达式或类似的东西,否则您无需转义*, 或/if 那就是您要转义的内容。

如果战斗日志是一个字符串,它的 contains 方法只检查一个字符序列。*name*如果你在字符串中寻找,你只需要 call combatLog.contains("*name*")

于 2013-06-27T20:04:31.507 回答
4

您正在使用正斜杠使用反斜杠:\转义字符

[编辑] 也正如 slaks 所说,您需要使用replace()which 接受字符串作为输入而不是正则表达式。

于 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 回答