【问题标题】:How to replace a special character with single slash如何用单斜杠替换特殊字符
【发布时间】:2012-08-21 22:35:56
【问题描述】:

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

String str = "The . startup trace ?state is info?";

由于字符串包含像"?" 这样的特殊字符,我需要根据我的要求将字符串替换为"\?"。如何用"\" 替换特殊字符?我尝试了以下方式。

str.replace("?","\?"); 

但它给出了编译错误。然后我尝试了以下方法:

str.replace("?","\\?");

当我这样做时,它会将特殊字符替换为 "\\"。但是当我打印字符串时,它会用单斜杠打印。我以为它只采用单斜杠,但当我调试时发现变量采用"\\"

谁能建议如何用单斜杠 ("\") 替换特殊字符?

【问题讨论】:

  • 请解决人们对您的问题的困惑。给出多个之前和之后的示例,涵盖您的所有期望。

标签: java


【解决方案1】:

关于转义序列

声明如下:

String s = "\\";

定义一个包含单个反斜杠的字符串。即s.length() == 1

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

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

当然,您可以在 String 文字中将转义序列与普通的非转义字符结合起来:

System.out.println("\"Hey\\\nHow\tare you?");

以上打印(标签间距可能会有所不同):

"Hey\
How are you?

参考文献

另见


回到问题

您的问题定义非常模糊,但以下 sn-p 可以正常工作:

System.out.println("How are you? Really??? Awesome!".replace("?", "\\?"));

上面的 sn-p 将 ? 替换为 \?,因此打印:

How are you\? Really\?\?\? Awesome!

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

System.out.println("How are you? Really??? Awesome!".replace('?', '\\'));

上面的 sn-p 将? 替换为\,从而打印:

How are you\ Really\\\ Awesome!

StringAPI 链接


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

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

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

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

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

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

以上打印:

Who you gonna call<?> GHOSTBUSTERS<!!!>

模式[?!]+ 匹配字符类[...] 定义(在本例中包含?!)中的任何字符的一个或多个(+)。替换字符串&lt;$0&gt; 实质上将整个匹配项$0 放在尖括号内。

相关问题

正则表达式引用

【讨论】:

    【解决方案2】:

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

    str.replace("?", "\\?")
    
    str.replaceAll("\\?","\\\\?");
    

    结果是"The . startup trace \?state is info\?"

    如果您想用\ 替换?,只需从第二个参数中删除? 字符。

    【讨论】:

    • 你不是Java 1.5吗? 编辑:抱歉,您的编辑仍然没有解释实际问题:)
    • @BalusC:我再次编辑了我的答案。我不明白 OP 到底想要什么。
    • OP 想知道为什么他需要双反斜杠来匹配单个反斜杠。 Polygenelubricants 很好地解释了这一点。
    • 他还问'谁能建议如何...'
    【解决方案3】:

    但是当我打印字符串时,它会打印 用单斜线。

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

    有两个简单的规则:

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

    2. 正则表达式中的反斜杠必须指定为两个以满足正则表达式,否则将被视为 regex 转义。因为 (1) 这意味着你必须写 2x2=4 其中:"\\\\" (因为论坛软件我实际上必须写 8 个!)。

    【讨论】:

      【解决方案4】:
              String str="\\";
              str=str.replace(str,"\\\\");
              System.out.println("New String="+str);
      

      输出:- 新字符串=\

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

      【讨论】:

        猜你喜欢
        • 2021-09-02
        • 2023-03-18
        • 2014-02-01
        • 1970-01-01
        • 2020-03-15
        • 2023-03-16
        • 2019-09-18
        • 1970-01-01
        • 2013-09-26
        相关资源
        最近更新 更多