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

swa*_*ati 4 java

我对Java中的字符串有疑问.比方说,我有一个像这样的字符串:

String str = "The . startup trace ?state is info?";
Run Code Online (Sandbox Code Playgroud)

因为字符串包含特殊字符,"?"所以我需要"\?"根据我的要求替换字符串.如何用特殊字符替换"\"?我尝试了以下方式.

str.replace("?","\?"); 
Run Code Online (Sandbox Code Playgroud)

但它给出了编译错误.然后我尝试了以下内容:

str.replace("?","\\?");
Run Code Online (Sandbox Code Playgroud)

当我这样做时,它取代了特殊字符 "\\".但是当我打印字符串时,它会打印出单斜杠.我认为它只采用单斜杠,但是当我调试时,我发现该变量正在进行中"\\".

任何人都可以建议如何用单斜杠("\")替换特殊字符?

pol*_*nts 5

关于转义序列

声明如下:

String s = "\\";
Run Code Online (Sandbox Code Playgroud)

定义包含单个反斜杠的字符串.就是这样s.length() == 1.

这是因为它\是一个Java转义字符Stringchar文字.以下是其他一些例子:

  • "\n"String包含换行符的长度为1的长度
  • "\t"String包含制表符的长度为1的长度
  • "\""String长度为1的,包含双引号字符
  • "\/"包含无效的转义序列,因此不是有效的String文字
    • 它会导致编译错误

当然,您可以将转义序列与正常的未转义字符组合在一个String文字中:

System.out.println("\"Hey\\\nHow\tare you?");
Run Code Online (Sandbox Code Playgroud)

以上打印件(标签间距可能不同):

"Hey\
How are you?
Run Code Online (Sandbox Code Playgroud)

参考

也可以看看


回到问题所在

您的问题定义非常模糊,但以下代码段可以正常工作:

System.out.println("How are you? Really??? Awesome!".replace("?", "\\?"));
Run Code Online (Sandbox Code Playgroud)

上面的代码片段替换?\?,因此打印:

How are you\? Really\?\?\? Awesome!
Run Code Online (Sandbox Code Playgroud)

如果您想要替换char另一个char,那么还有一个重载:

System.out.println("How are you? Really??? Awesome!".replace('?', '\\'));
Run Code Online (Sandbox Code Playgroud)

上面的代码片段替换?\,因此打印:

How are you\ Really\\\ Awesome!
Run Code Online (Sandbox Code Playgroud)

String API链接


关于正则表达式如何使事情复杂化

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

  • Java中的正则表达式模式以String值的形式给出
  • 元字符(例如?.)具有特殊含义,可能需要通过前面的反斜杠进行转义才能完全匹配
  • 反斜杠也是替换String值中的特殊字符

上述因素可能导致需要在Java源代码中的模式和替换字符串中存在大量反斜杠.

看起来你不需要这个问题的正则表达式,但这里有一个简单的例子来说明它可以做什么:

    System.out.println(
        "Who you gonna call? GHOSTBUSTERS!!!"
            .replaceAll("[?!]+", "<$0>")
    );
Run Code Online (Sandbox Code Playgroud)

以上打印:

Who you gonna call<?> GHOSTBUSTERS<!!!>
Run Code Online (Sandbox Code Playgroud)

图案[?!]+匹配一个或更多的(+在字符类的任何字符)[...]定义(其中包含一个?!在这种情况下).替换字符串<$0>实际上将整个匹配$0放在有角度的括号内.

相关问题

正则表达式引用