使用Java,我想浏览文本行并用&XML实体引用替换所有的&符号()&.
我使用Scanner类扫描文本的行,然后扫描文本中的每个单词.然后我用它CharacterIterator来迭代单词的每个字符.但是,我该如何更换角色呢?首先,字符串是不可变对象.其次,我想&用几个字符(amp&;)替换一个字符().我该怎么做呢?
CharacterIterator it = new StringCharacterIterator(token);
for(char ch = it.first(); ch != CharacterIterator.DONE; ch = it.next()) {
if(ch == '&') {
}
}
Run Code Online (Sandbox Code Playgroud)
Amb*_*ber 117
尝试使用String.replace()或String.replaceAll()替代.
String my_new_str = my_str.replace("&", "&");
Run Code Online (Sandbox Code Playgroud)
(两者都替换所有出现; replaceAll允许使用正则表达式.)
Yis*_*hai 89
简单的答案是:
token = token.replace("&", "&");
Run Code Online (Sandbox Code Playgroud)
尽管名称与replaceAll相比,replace确实做了一个replaceAll,它只是不使用正则表达式,这似乎在这里顺序(从性能和良好实践的角度来看 - 不要偶然使用正则表达式因为他们有特殊的性格要求,你不会注意到).
如果您已经知道此代码是性能的热点,那么Sean Bright的答案可能从性能角度考虑是值得考虑的,如果这是您的问题的来源.它当然不值得投票.除非您需要同步,否则只需使用StringBuilder而不是StringBuffer.
话虽如此,这里有一个更深层次的潜在问题.转义字符是一个众所周知的问题,许多库都在那里解决.您可能需要考虑将数据包装在XML中的CDATA部分中,或者您可能更喜欢使用XML库(包括现在随JDK附带的那个)来实际生成XML(以便它将处理编码) ).
作为Commons Lang的一部分,Apache还有一个转义库.
Sea*_*ght 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();
Run Code Online (Sandbox Code Playgroud)
您可能还需要检查以确保不替换已替换的事件.您可以使用带有负前瞻的正则表达式来执行此操作.
例如:
String str = "sdasdasa&adas&dasdasa";
str = str.replaceAll("&(?!amp;)", "&");
Run Code Online (Sandbox Code Playgroud)
这将导致字符串" sdasdasa&adas&dasdasa".
正则表达式模式"&(?!amp;)"基本上说:匹配任何'&'后面没有'amp;'的出现.
只需创建一个包含所有相关数据的字符串,然后使用String.replaceAll()如下所示。
String result = yourString.replaceAll("&", "&");
Run Code Online (Sandbox Code Playgroud)