【问题标题】:Replace a string by character code instead of regex?用字符代码而不是正则表达式替换字符串?
【发布时间】:2013-10-06 18:21:50
【问题描述】:

Java(或任何其他第 3 方库)是否提供 API 用于根据字符代码(当然在已知的 Charset 内)而不是正则表达式替换字符?例如,要将给定字符串中的双引号替换为单引号,可以使用:

String noDoubles = containsDoubles.replace("\"", "'");

但是,双引号的 UTF-8 字符代码是 U+0022。那么有什么东西可以搜索U+0022 字符的实例并用单引号替换它们吗?

另外,这里不只是询问双引号/单引号,我说的是字符代码查找和任意 2 个字符的替换。

【问题讨论】:

  • 我个人认为"\""'\u0022' 更清楚你在做什么。
  • 针对已发布的一些答案:请不要对 U+0020 到 U+007E 范围内的字符使用 Unicode 文字 (\uhhhh)。显然很容易认为它们就像字符串或字符文字中的其他转义序列一样工作(如\n),但事实并非如此;在 Java 中,它们被更早地解释并可能影响语法。只是为了好玩,试着在你的脑海中猜测它会输出什么:System.out.println("\u005c\u006n".length());,然后试试看它实际输出什么。
  • @ajb 由于非法的 unicode 转义码(不允许使用“n”)而无法编译:ideone.com/pMyNY6
  • @PhilippWendler Duh。应该是System.out.println("\u005c\u006e".length());

标签: java regex string character-encoding replace


【解决方案1】:

使用重载版本 - String#replace(char, char) 接受字符。所以,你可以这样使用它:

String str = "aa \" bb \"";
str = str.replace('\u0022', '\'');
System.out.println(str);  // aa ' bb '

【讨论】:

    【解决方案2】:

    只需使用 unicode 文字:

    // I'm using an unicode literal for "
    String noDoubles = containsDoubles.replace('\u0022', '\'');
    

    只要您知道其对应的代码,以上内容适用于任何字符。

    【讨论】:

    • 这行不通! '\u0027' 不会编译,因为 \u0027 很早就被单引号替换了,因此这与将 replace('\u0022','''); 放入代码中的结果相同,这在语法上是不正确的。我刚试了一下,编译器拒绝了。
    【解决方案3】:

    您还可以使用正则表达式。来自Javadoc

    \xhh 十六进制值为0xhh的字符

    \uhhhh 十六进制值为0xhhhh的字符

    因此你可以这样写:

    String noDoubles = containsDoubles.replace("\\u0022", "'");
    

    【讨论】:

    • 以上将无法编译。编译器在其处理过程中将\uhhhh 替换为实际字符very early。因此,您的部分陈述等同于 (""","'");,这是非法的,因为您有一个未闭合的引号。 (我试过了。)另外,replace 不使用正则表达式(replaceAll 使用)。这应该可以工作:replaceAll("\\u0022","'"); 尽管与仅使用 replace('"','\''); 相比,它看起来相当繁重。
    • @ajb 哦,是的,谢谢。我最近一直在 ant 文件中做一些正则表达式,你不需要逃避转义。 :)
    猜你喜欢
    • 2018-10-30
    • 2013-01-21
    • 2018-07-13
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    相关资源
    最近更新 更多