使用Java语言,我想遍历文本的每一行,并用XML实体引用&
替换所有的“与”符号(&
)。
我扫描文本行,然后使用Scanner类扫描文本中的每个单词。然后,我使用CharacterIterator
遍历单词的每个字符。但是,我如何替换这个字符?首先,字符串是不可变的对象。其次,我想用几个字符(amp&;
)替换一个字符(&
)。我应该如何处理这个问题?
CharacterIterator it = new StringCharacterIterator(token);
for(char ch = it.first(); ch != CharacterIterator.DONE; ch = it.next()) {
if(ch == '&') {
}
}
发布于 2009-08-05 17:04:37
请尝试使用String.replace()
或String.replaceAll()
。
String my_new_str = my_str.replace("&", "&");
(两者都会替换所有出现的内容;replaceAll
允许使用正则表达式。)
发布于 2009-08-05 17:58:17
简单的答案是:
token = token.replace("&", "&");
尽管名字与replaceAll相比,replace确实做了一个replaceAll,只是它不使用正则表达式,这在这里似乎是符合顺序的(从性能和良好实践的角度来看-不要偶然使用正则表达式,因为它们有特殊的字符要求,而你不会注意到)。
Sean Bright的答案可能是从性能角度考虑的最好的答案,如果你已经知道这段代码是性能的热点,如果你的问题来自于此,那么从性能和性能测试方面没有更多的目标要求。它当然不配得到反对票。除非您需要同步,否则只需使用StringBuilder而不是StringBuffer。
也就是说,这里有一个更深层次的潜在问题。转义字符是一个已知的问题,许多库都在解决这个问题。您可能希望考虑将数据包装在XML中的CDATA部分中,或者您可能更喜欢使用XML库(包括现在JDK附带的库)来正确地实际生成XML (以便它可以处理编码)。
阿帕奇也有一个escaping library作为Commons Lang的一部分。
发布于 2009-08-05 17:06:10
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();
https://stackoverflow.com/questions/1234510
复制相似问题