如何替换正则表达式的内容

时间:2014-04-06 04:37:58

标签: java regex string replace

我的大脑今晚可能无法正常工作,但我需要一些帮助。

我有这个字符串

[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;
}

5 个答案:

答案 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)

您可以使用以下正则表达式进行匹配:

\[([^\s])\]

然后替换为[x]

正则表达式演示

http://regex101.com/r/mH4mH1