Java 如何用单斜杠替换特殊字符

Java 如何用单斜杠替换特殊字符,java,Java,我有一个关于Java中字符串的问题。比方说,我有一个这样的字符串: String str = "The . startup trace ?state is info?"; 由于字符串包含特殊字符,如“?”,我需要根据我的要求将字符串替换为“\?”。如何将特殊字符替换为“\”?我试着用下面的方法 str.replace("?","\?"); 但它给出了一个编译错误。然后我尝试了以下方法: str.replace("?","\\?"); 当我这样做时,它会将特殊字符替换为“\\”。但当我打印

我有一个关于Java中字符串的问题。比方说,我有一个这样的字符串:

String str = "The . startup trace ?state is info?";
由于字符串包含特殊字符,如
“?”
,我需要根据我的要求将字符串替换为
“\?”
。如何将特殊字符替换为
“\”
?我试着用下面的方法

str.replace("?","\?"); 
但它给出了一个编译错误。然后我尝试了以下方法:

str.replace("?","\\?");
当我这样做时,它会将特殊字符替换为
“\\”
。但当我打印字符串时,它会以单斜杠打印。我原以为它只使用单斜杠,但调试时发现变量使用的是
“\\\”


有人能建议如何用单斜杠(
“\”
)替换特殊字符吗?

如果您想用
\?
替换
,有两种可能性:
替换
替换所有
(对于正则表达式):

结果是
“启动跟踪\?状态为info\?”

如果要将
替换为
\
,只需从第二个参数中删除
字符

关于逃逸序列 声明如下:

String s = "\\";
定义包含单个反斜杠的字符串。也就是说,
s.length()==1

这是因为
\
String
char
文本的Java转义字符。以下是一些其他示例:

  • “\n”
    是长度为1的
    字符串,包含换行符
  • “\t”
    是长度为1的
    字符串,包含制表符
  • “\”
    是长度为1的
    字符串,包含双引号字符
  • “\/”
    包含无效的转义序列,因此不是有效的
    字符串
    
    • 它会导致编译错误
当然,您可以将转义序列与
字符串中的正常未转义字符组合起来:

System.out.println("\"Hey\\\nHow\tare you?");
上述打印(制表符间距可能不同):

工具书类
另见

回到问题上来 您的问题定义非常模糊,但以下代码段的工作原理如下:

System.out.println("How are you? Really??? Awesome!".replace("?", "\\?"));
上述代码段将
替换为
\?
,从而打印:

How are you\? Really\?\?\? Awesome!
How are you\ Really\\\ Awesome!
如果您想用另一个
char
替换一个
char
,那么还有一个重载:

System.out.println("How are you? Really??? Awesome!".replace('?', '\\'));
上述代码段将
替换为
\
,从而打印:

How are you\? Really\?\?\? Awesome!
How are you\ Really\\\ Awesome!
String
API链接
    • 用指定的文字
      替换
      序列替换与文字
      目标
      序列匹配的此字符串的每个子字符串
    • 返回将此字符串中所有出现的
      oldChar
      替换为
      newChar
      后生成的新字符串

关于正则表达式如何使事情复杂化 如果您使用的是
replaceAll
或任何其他基于正则表达式的方法,那么事情就会变得更加复杂。如果您了解一些基本规则,就可以大大简化

  • Java中的正则表达式模式以
    String
    值的形式给出
  • 元字符(如
    )具有特殊含义,可能需要在前面加上反斜杠进行转义,以便逐字匹配
  • 反斜杠也是替换
    String
    值中的一个特殊字符
上述因素可能导致在Java源代码中的模式和替换字符串中需要大量反斜杠

对于这个问题,您似乎不需要正则表达式,但这里有一个简单的示例来说明它可以做什么:

    System.out.println(
        "Who you gonna call? GHOSTBUSTERS!!!"
            .replaceAll("[?!]+", "<$0>")
    );
System.out.println(
“你要打电话给谁?捉鬼者!!!”
.replaceAll(“[?!]”+“,”)
);
上述印刷品:

Who you gonna call<?> GHOSTBUSTERS<!!!>
你要叫谁来捉鬼
模式
[?!]+
匹配字符类
[…]
定义中任何字符的一个或多个(
+
)(在本例中,该定义包含
)。替换字符串
基本上将整个匹配的
$0
放在角括号内

相关问题
  • -讨论常见错误,如
    split(“.”
    split(“|”)
正则表达式引用
但当我打印字符串时,它会打印 用单斜杠

很好,这正是你想要的,不是吗

有两条简单的规则:

  • 字符串文字中的反斜杠必须指定为2才能满足编译器的要求,即“\”。否则它将被视为特殊字符转义

  • 正则表达式中的反斜杠必须指定为2才能满足正则表达式的要求,否则它将被视为正则表达式转义。因为(1)这意味着您必须编写2x2=4个反斜杠:“\\\”(因为论坛软件,我实际上必须编写8!)

  • 输出:-新字符串=\


    在java中,
    “\\”
    视为
    “\”
    。因此,上面的代码将
    “\”
    单斜杠替换为
    \\“

    你还没开机吗?编辑:抱歉,你的编辑仍然无法解释实际问题:)@BalusC:我再次编辑了我的答案。我不明白OP到底想要什么。OP想知道为什么他需要一个双反斜杠来匹配一个单反斜杠。Polygene很好地解释了这一点。他还问:“有人能建议如何……”请解决人们对你的问题的困惑。给出多个前后的例子,涵盖你的所有期望。
            String str="\\";
            str=str.replace(str,"\\\\");
            System.out.println("New String="+str);