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

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

我扫描的文本行,然后每个单词的文本与扫描仪类。然后使用 CharacterIterator迭代单词的每个字符。但是,如何替换字符?首先,String 是不可变的对象。其次,我想用几个字符(amp&;)替换一个字符(&)。我该怎么做?

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


}
}
483093 次浏览

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

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

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

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();

只需创建一个包含所有相关数据的字符串,然后使用如下 Replace All ()

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

如果您正在使用 Spring,您可以简单地调用 HtmlUtils.htmlEscape(String input),它将处理“ &”到“ &”的转换。

转义字符串 可能有点棘手-特别是如果您想要考虑 unicode。我认为 XML 是可以转义的较简单的格式/语言之一,但仍然是。我建议您查看 ApacheCommons Lang 中的 StringEscapeUtils 类及其方便的 EscapeXml方法。

您可能还需要进行检查,以确保没有替换已被替换的事件。您可以使用带有负向前瞻的正则表达式来完成此操作。

例如:

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

这将导致字符串“ sdasdasa&amp;adas&amp;dasdasa”。

正则表达式(regex)模式“ & (? ! amp;)”基本上表示: 匹配‘ &’后面没有跟着‘ amp;’的任何匹配项。

答案很简单:

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

尽管名字和 replace All 相比有所不同,但是它确实做了一个 replace All,它只是没有使用正则表达式,在这里似乎是合乎规则的(从性能和良好实践的角度来看——不要偶然使用正则表达式,因为它们有特殊的字符要求,你不会注意到)。

如果您已经知道这段代码是性能方面的热点,如果您的问题就是从这个角度出发的,那么 Sean Bright 的回答可能是值得从性能角度思考的,但是没有进一步的性能和性能测试目标要求。它当然不应该得到反对票。只要使用 StringBuilder 而不是 StringBuffer,除非您需要同步。

尽管如此,这里还有一个更深层次的潜在问题。转义字符是一个众所周知的问题,许多库都解决了这个问题。您可能需要考虑将数据包装在 XML 中的 CDATA 部分中,或者您可能更愿意使用 XML 库(包括现在 JDK 附带的库)来实际正确地生成 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);
}
}
}

尝试此代码。您可以用另一个给定的字符替换任何字符。 在这里,我尝试将字母 “ a”替换为给定字符串 < strong > “ abcdea”的 "-"字符

输出—— > _ 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");
}


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

可以使用 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();