我的大脑今晚可能无法正常工作,但我需要一些帮助。
我有这个字符串
[9] [1] [1] [] [] [] [] [] [] [9] [a] [b] [] []
我想用不同的字符替换括号中的任何内容。 为了简化,我们只说x。
然而,它不会是x。我将通过一个函数来运行它,将每个数字更改为颜色代码。完成后它会是这样的。 [x] [x] [x] [] [] [] [] [] [] [x] [x] [x] [] []
我尝试了一些荒谬的string.replace()函数,但无济于事。
编辑: 我运行此函数的每个数字
public ChatColor getColor(String id)
{
ChatColor color = ChatColor.WHITE;
if(id == "0") color = ChatColor.BLACK;
if(id == "1") color = ChatColor.DARK_BLUE;
if(id == "2") color = ChatColor.DARK_GREEN;
if(id == "3") color = ChatColor.DARK_AQUA;
if(id == "4") color = ChatColor.DARK_RED;
if(id == "5") color = ChatColor.DARK_PURPLE;
if(id == "6") color = ChatColor.GOLD;
if(id == "7") color = ChatColor.GRAY;
if(id == "8") color = ChatColor.DARK_GRAY;
if(id == "9") color = ChatColor.BLUE;
if(id == "a") color = ChatColor.GREEN;
if(id == "b") color = ChatColor.AQUA;
if(id == "c") color = ChatColor.RED;
if(id == "d") color = ChatColor.LIGHT_PURPLE;
if(id == "e") color = ChatColor.YELLOW;
if(id == "f") color = ChatColor.WHITE;
return color;
}
答案 0 :(得分:1)
这是一个使用预见的解决方案。
String input = "[9][1][1][ ][ ][ ][ ][ ][ ][9][a][b][ ][ ]";
// Map of color codes.
HashMap<String,String> colorMap;
String output = input.replaceAll("(?<=\\[)\\S*?(?=\\])","x");
根据您对devnull答案的评论,听起来您实际上想要一个映射替换:
String input = "[9][1][1][ ][ ][ ][ ][ ][ ][9][a][b][ ][ ]";
// Map of color codes.
for (int i = 0; i < 16; i++) {
String current = Integer.toString(i, 16);
input = input.replaceAll("(?<=\\[)" + current + "(?=\\])",getColor(current));
}
System.out.println(input);
请注意,此解决方案假定ChatColor
具有合理的toString
方法。
答案 1 :(得分:1)
首先,为什么不拔出字符串上的每个字符,应用一些函数来更改字符以适合您指定的某些颜色代码,然后重新组合字符串。你可以在循环中运行循环,并根据需要多次执行(我的意思是,将循环的底部放入另一个for循环中,具体取决于进程要采用的迭代次数和各种条件)。例如,您有:
String s = [9][1][1][ ][ ][ ][ ][ ][ ][9][a][b][ ][ ]
让我们接下来循环遍历每个字符,并在每个字符c处根据某些条件替换字符。这里有多种选择可以替换,我只是在相关的地方留下评论我可能会尝试。这是建议的for循环。
for (int i = 0; i < s.length(); i++){
char c = s.charAt(i);
//Process char
//Add new character to a new string here and then reassemble the string
}
答案 2 :(得分:1)
使用拆分的方式:
String s = "[1][1][4][2][6][d][][][][a][8]";
String[] tok = s.split("(?<=\\[)(?=[0-9a-f]\\])|(?<=\\[[0-9a-f])(?=\\])");
String result = "";
for (int i=0; i<tok.length; i++) {
if (i%2==1) {
result += getColor(tok[i]);
} else {
result += tok[i];
}
}
答案 3 :(得分:0)
您可能想要做的一个解决方案是创建一个正则表达式模式,然后从中创建一个匹配器并使用它来替换字符串中的字符。
这两个类的API有望提供您需要的所有信息(包括不同的正则表达式符号的含义)。
http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html http://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html
如果您对如何使用这些类有任何疑问,请访问谷歌的好消息来源: http://www.vogella.com/tutorials/JavaRegularExpressions/article.html http://www.tutorialspoint.com/java/java_regular_expressions.htm
看到对方的答案,这可能就是在调用String.replaceAll()时它在后端做的事情,所以这不再是最好的解决方案。我会在他们的答案中说出我要说的评论,但我的名声很低。您可以做的是为每个代码添加多个替换语句。
s = s.replaceAll("\\[1\\]", "[x]"));
s = s.replaceAll("\\[2\\]", "[y]"));
s = s.replaceAll("\\[3\\]", "[z]"));
答案 4 :(得分:0)