【发布时间】:2009-12-23 00:03:00
【问题描述】:
我目前有一个包含字符 A、B 和 C 的字符串,例如字符串看起来像
"A some other random stuff B C"
其他随机的东西不包含 A、B 或 C 我想分别用“A”、“B”和“C”替换 A、B 和 C 目前我正在做的最好的方法是什么:
String.replace("A", "'A'").replace("B", "'B'").replace("C", "'C'")
【问题讨论】:
我目前有一个包含字符 A、B 和 C 的字符串,例如字符串看起来像
"A some other random stuff B C"
其他随机的东西不包含 A、B 或 C 我想分别用“A”、“B”和“C”替换 A、B 和 C 目前我正在做的最好的方法是什么:
String.replace("A", "'A'").replace("B", "'B'").replace("C", "'C'")
【问题讨论】:
如果 A、B 和 C 是那些确切的单个字符,则
cletus 的答案可以正常工作,但如果它们可能是更长的字符串并且您只是出于示例目的将它们称为 A、B 和 C,则不会。如果它们是较长的字符串,您需要这样做:
String input = "FOO some other random stuff BAR BAZ";
String output = input.replaceAll("FOO|BAR|BAZ", "'$0'");
您还需要转义 FOO、BAR 和 BAZ 中的任何特殊字符,以免它们被解释为特殊的正则表达式符号。
【讨论】:
使用正则表达式:
String input = "A some other random stuff B C";
String output = input.replaceAll("[ABC]", "'$0'");
输出:
'A' some other random stuff 'B' 'C'
【讨论】:
查看来自 Apache Commons Lang 的 StringUtils 及其各种 replace 方法。
【讨论】:
String 时不确定这是一个问题:)
如果那些是相当复杂的字符串,我认为正则表达式并不适合。
考虑将其包装在您自己的实用方法中,将数组或列表作为参数。
public static String replace(String string, String[] toFind, String[] toReplace) {
if (toFind.length != toReplace.length) {
throw new IllegalArgumentException("Arrays must be of the same length.");
}
for (int i = 0; i < toFind.length; i++) {
string = string.replace(toFind[i], toReplace[i]);
}
return string;
}
也许 Apache Commons 或 Google 代码中已经有一个。如果您更喜欢 3rd 方 API 而不是自产的东西,请看一看。
编辑:为什么要否决技术上正确但您认为不喜欢的答案?只是不要投票。
【讨论】:
replace(CharSequence, CharSequence) 的来源,它确实 如您所演示的那样实际上在后台使用了replaceAll,但随后多了一个标志Pattern.LITERAL这可能会减少开销。
其他人的答案更好,但是在您尝试学习的假设下,我想指出您原始代码的问题。
这将是您正在尝试做的事情的“固定”版本(使用您的风格,这很接近)以及您需要做的事情才能使其发挥作用:
public String quoteLetters(String s)
{
return s.replace("A", "'A'").replace("B", "'B'").replace("C", "'C'");
}
以下是您遇到的问题:
【讨论】: