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

时间:2009-08-05 17:02:37

标签: 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 == '&') {

       }
}

11 个答案:

答案 0 :(得分:112)

请尝试使用String.replace()String.replaceAll()

String my_new_str = my_str.replace("&", "&");

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

答案 1 :(得分:88)

简单的答案是:

token = token.replace("&", "&");

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

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

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

Apache也有一个escaping library作为Commons Lang的一部分。

答案 2 :(得分: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();

答案 3 :(得分:8)

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

例如:

String str = "sdasdasa&amp;adas&dasdasa";  
str = str.replaceAll("&(?!amp;)", "&amp;");

这会产生字符串“sdasdasa&amp;adas&amp;dasdasa”。

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

答案 4 :(得分:4)

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

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

答案 5 :(得分:1)

转义字符串can be tricky - 特别是如果你想考虑unicode。我认为XML是一种比较简单的格式/语言可以逃脱但仍然存在。我建议看一下Apache Commons Lang中的StringEscapeUtils类及其方便的escapeXml方法。

答案 6 :(得分:1)

尝试此代码。您可以使用其他给定字符替换任何字符。 在这里,我尝试将&#39; a&#39; 替换为&#34; - &#34; 字符作为字符串&#34 ; abcdeaa&#34;

OutPut - &gt; _bcdef __

    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");
    }

}

答案 7 :(得分:1)

您可以使用streamflatMap&映射到&amp;

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

答案 8 :(得分:0)

如果您使用的是Spring,只需拨打HtmlUtils.htmlEscape(String input)即可处理'&amp;'到'&amp;'翻译。

答案 9 :(得分:0)

//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);
            }
        }
    }

答案 10 :(得分:-2)

String taskLatLng = task.getTask_latlng().replaceAll( "\\(","").replaceAll("\\)","").replaceAll("lat/lng:", "").trim();