如何在Java中替换字符串中的字符?

use*_*155 64 java replace

使用Java,我想浏览文本行并用&XML实体引用替换所有的&符号()&.

我使用Scanner类扫描文本的行,然后扫描文本中的每个单词.然后我用它CharacterIterator来迭代单词的每个字符.但是,我该如何更换角色呢?首先,字符串是不可变对象.其次,我想&用几个字符(amp&;)替换一个字符().我该怎么做呢?

CharacterIterator it = new StringCharacterIterator(token);
for(char ch = it.first(); ch != CharacterIterator.DONE; ch = it.next()) {
       if(ch == '&') {

       }
}
Run Code Online (Sandbox Code Playgroud)

Amb*_*ber 117

尝试使用String.replace()String.replaceAll()替代.

String my_new_str = my_str.replace("&", "&");
Run Code Online (Sandbox Code Playgroud)

(两者都替换所有出现; replaceAll允许使用正则表达式.)

  • 注意replaceAll,因为它使用它的第一个参数作为正则表达式.即"你好".replaceAll(".",",")会给你",,,,,,,,,"!在Java 1.5中有新的String.replace(CharSequence,CharSequence)方法,它执行类似的操作,但不会将第一个参数解释为正则表达式. (68认同)
  • 这不是你逃避角色的方式。我认为彼得的观点是,当你不需要时使用正则表达式可能会产生意想不到的副作用。 (2认同)

Yis*_*hai 89

简单的答案是:

token = token.replace("&", "&");
Run Code Online (Sandbox Code Playgroud)

尽管名称与replaceAll相比,replace确实做了一个replaceAll,它只是不使用正则表达式,这似乎在这里顺序(从性能和良好实践的角度来看 - 不要偶然使用正则表达式因为他们有特殊的性格要求,你不会注意到).

如果您已经知道此代码是性能的热点,那么Sean Bright的答案可能从性能角度考虑是值得考虑的,如果这是您的问题的来源.它当然不值得投票.除非您需要同步,否则只需使用StringBuilder而不是StringBuffer.

话虽如此,这里有一个更深层次的潜在问题.转义字符是一个众所周知的问题,许多库都在那里解决.您可能需要考虑将数据包装在XML中的CDATA部分中,或者您可能更喜欢使用XML库(包括现在随JDK附带的那个)来实际生成XML(以便它将处理编码) ).

作为Commons Lang的一部分,Apache还有一个转义库.


Sea*_*ght 14

StringBuilder s = new StringBuilder(token.length());

CharacterIterator it = new StringCharacterIterator(token);
for (char ch = it.first(); ch != CharacterIterator.DONE; ch = it.next()) {
    switch (ch) {
        case '&':
            s.append("&");
            break;
        case '<':
            s.append("&lt;");
            break;
        case '>':
            s.append("&gt;");
            break;
        default:
            s.append(ch);
            break;
    }
}

token = s.toString();
Run Code Online (Sandbox Code Playgroud)

  • 继我之前的评论之后,我刚刚测量了replaceAll和Sean的解决方案对5000字符串的性能,其中大约10%的字符是'&' - 平均替换所有时间是0.92ms而Sean的解决方案是0.29ms.使用StringBuilder可将时间进一步缩短至0.23ms. (6认同)
  • +1:不确定为什么这会收到2个downvotes - 它可能比replaceAll()更有效 - 毕竟为什么在简单匹配单个字符时使用正则表达式? (4认同)
  • 改为使用String将导致每次迭代创建一个临时String对象.我不确定你会建议的替代方案. (2认同)
  • 这不是过早的优化-这是我对问题的回答。它碰巧也比String.replaceAll()快,但这不是建议这样做的原因。 (2认同)

Rob*_*gin 8

您可能还需要检查以确保不替换已替换的事件.您可以使用带有负前瞻的正则表达式来执行此操作.

例如:

String str = "sdasdasa&amp;adas&dasdasa";  
str = str.replaceAll("&(?!amp;)", "&amp;");
Run Code Online (Sandbox Code Playgroud)

这将导致字符串" sdasdasa&amp;adas&amp;dasdasa".

正则表达式模式"&(?!amp;)"基本上说:匹配任何'&'后面没有'amp;'的出现.


Tay*_*ese 5

只需创建一个包含所有相关数据的字符串,然后使用String.replaceAll()如下所示。

String result = yourString.replaceAll("&", "&amp;");
Run Code Online (Sandbox Code Playgroud)