使用Java,我想浏览文本行,并用XML实体引用&
替换所有&符号(&
)。
我使用Scanner类扫描文本的行,然后扫描文本中的每个单词。然后我使用CharacterIterator
迭代单词的每个字符。但是,我该如何更换角色呢?首先,字符串是不可变对象。其次,我想用几个字符(&
)替换一个字符(amp&;
)。我该怎么做呢?
CharacterIterator it = new StringCharacterIterator(token);
for(char ch = it.first(); ch != CharacterIterator.DONE; ch = it.next()) {
if(ch == '&') {
}
}
答案 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("<");
break;
case '>':
s.append(">");
break;
default:
s.append(ch);
break;
}
}
token = s.toString();
答案 3 :(得分:8)
您可能还需要检查以确保不替换已替换的事件。您可以使用带有负前瞻的正则表达式来执行此操作。
例如:
String str = "sdasdasa&adas&dasdasa";
str = str.replaceAll("&(?!amp;)", "&");
这会产生字符串“sdasdasa&adas&dasdasa
”。
正则表达式模式“&amp;(?!amp;)”基本上说:匹配任何'&amp;'的出现没有'amp;'。
答案 4 :(得分:4)
只需创建一个包含所有相关数据的字符串,然后使用下面的String.replaceAll()。
String result = yourString.replaceAll("&", "&");
答案 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)
您可以使用stream
和flatMap
将&
映射到&
String str = "begin&end";
String newString = str.chars()
.flatMap(ch -> (ch == '&') ? "&".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();