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

在Java中如何替换字符串中的字符?,java,replace,Java,Replace,使用Java,我希望遍历文本的行,并用XML实体引用替换所有的符号(&) 我扫描文本行,然后使用Scanner类扫描文本中的每个单词。然后我使用CharacterIterator对单词的每个字符进行迭代。但是,如何替换角色?首先,字符串是不可变的对象。其次,我想用几个字符(amp&)替换一个字符(&)。我应该如何处理这个问题 CharacterIterator it = new StringCharacterIterator(token); for(char ch = it.first(); c

使用Java,我希望遍历文本的行,并用XML实体引用替换所有的符号(
&

我扫描文本行,然后使用Scanner类扫描文本中的每个单词。然后我使用
CharacterIterator
对单词的每个字符进行迭代。但是,如何替换角色?首先,字符串是不可变的对象。其次,我想用几个字符(
amp&
)替换一个字符(
&
)。我应该如何处理这个问题

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

       }
}

尝试改用
String.replace()
String.replaceAll()

String my_new_str = my_str.replace("&", "&");
(两者都替换所有引用;
replaceAll
允许使用正则表达式。)

StringBuilder s=new StringBuilder(token.length());
Characteristator it=新字符串Characteristator(令牌);
for(char ch=it.first();ch!=CharacterIterator.DONE;ch=it.next()){
开关(ch){
案例“&”:
s、 附加(“&;”;
打破
案例“”:
s、 附加(“”);
打破
违约:
s、 附加(ch);
打破
}
}
token=s.toString();

只需创建一个包含所有相关数据的字符串,然后像下面这样使用

String result = yourString.replaceAll("&", "&");

如果您使用的是Spring,您只需调用
htmlitls.htmlEscape(字符串输入)
,它将处理“&”到“&”的转换。

转义字符串-特别是如果您想考虑unicode的话。我认为XML是一种更简单的格式/语言,但仍然是一种。我建议您查看Apache Commons Lang中的StringEscapeUtils类及其便捷的方法。

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

例如:

String str = "sdasdasa&adas&dasdasa";  
str = str.replaceAll("&(?!amp;)", "&");
这将导致字符串“
sdasa&;adas&;dasdasa

正则表达式模式“&(?amp;)”基本上是说:匹配任何不后跟“amp;”的“&”的出现

简单的答案是:

token = token.replace("&", "&");
尽管与replaceAll相比,replace的名称是replaceAll,但它没有使用正则表达式,这在这里似乎是合理的(从性能和良好实践的角度来看,不要意外地使用正则表达式,因为它们有您不会注意的特殊字符要求)

如果您已经知道此代码是性能的一个热点,并且您的问题来自于此,那么Sean Bright的答案可能是值得从性能角度考虑的,因为没有关于性能和性能测试的进一步目标要求。它当然不值得投反对票。除非需要同步,否则只需使用StringBuilder而不是StringBuffer

也就是说,这里有一个更深层次的潜在问题。转义字符是许多库都要解决的一个已知问题。您可能想考虑将数据封装在XML中的CDATA节中,或者您可能更喜欢使用XML库(包括现在使用JDK的XML库)来实际生成XML(以便它将处理编码)。 Apache也有一个作为Commons Lang的一部分的组件。

//我认为这会起作用,您不必在偶数时替换,这只是一个示例。
//I think this will work, you don't have to replace on the even, it's just an example. 

 public void emphasize(String phrase, char ch)
    {
        char phraseArray[] = phrase.toCharArray(); 
        for(int i=0; i< phrase.length(); i++)
        {
            if(i%2==0)// even number
            {
                String value = Character.toString(phraseArray[i]); 
                value = value.replace(value,"*"); 
                phraseArray[i] = value.charAt(0);
            }
        }
    }
公共空白强调(字符串短语,字符ch) { char phraseArray[]=phrase.toCharArray(); for(int i=0;i
试试这段代码。你可以用另一个给定的字符替换任何字符。 在这里,我尝试将给定字符串的字母'a'替换为“-”字符“abcdeaa”

输出-->\u bcdef\u

    public class Replace {

    public static void replaceChar(String str,String target){
        String result = str.replaceAll(target, "_");
        System.out.println(result);
    }

    public static void main(String[] args) {
        replaceChar("abcdefaa","a");
    }

}

您可以使用
stream
flatMap
映射到
&

    String str = "begin&end";
    String newString = str.chars()
        .flatMap(ch -> (ch == '&') ? "&amp;".chars() : IntStream.of(ch))
        .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
        .toString();

使用字符串将导致每次迭代都创建一个临时字符串对象。我不确定你会建议什么替代方案。+1:不确定为什么这会得到2张反对票-它可能比replaceAll()更有效-毕竟,在简单匹配单个字符时为什么要使用正则表达式?我之前的评论进一步指出,我刚刚测量了replaceAll和Sean的解决方案在5000个字符的字符串中的性能,其中大约10%的字符为“&”-平均replaceAll时间为0.92ms,而Sean的解决方案为0.29ms。使用StringBuilder将时间进一步提高到0.23毫秒。@Adamski-我只是想自己做性能测试。谢谢你帮我做腿部运动!这不是过早的优化——这是我对这个问题的回答。它恰好比
String.replaceAll()
快,但这不是建议使用它的原因。请小心使用replaceAll,因为它将其第一个参数用作正则表达式。例如,“h.e.l.l.o.”替换所有(“.”,“,”)将为您提供“,,,,,,,,,”!在Java 1.5中有一个新的String.replace(CharSequence,CharSequence)方法,它做了类似的事情,但不将第一个参数解释为正则表达式。@PeterŠtibranýOr。。。您可以只转义要替换的字符:
replaceAll(“[.]”、“,”)
这不是转义字符的方式。我认为peter的观点是,在不需要的情况下使用正则表达式可能会产生意外的副作用。这是有风险的,因为HTML定义的实体比纯XML定义的实体多得多。如果数据太大,则创建一个包含所有数据的字符串可能是不利的。我们也可以一行一行地做。在这种情况下使用replaceAll是错误的!如果
String taskLatLng = task.getTask_latlng().replaceAll( "\\(","").replaceAll("\\)","").replaceAll("lat/lng:", "").trim();
    String str = "begin&end";
    String newString = str.chars()
        .flatMap(ch -> (ch == '&') ? "&amp;".chars() : IntStream.of(ch))
        .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
        .toString();