Java Regex在占位符中查找所有占位符“{}”

时间:2017-02-05 22:55:06

标签: java regex

我遇到了一个问题,我现在已经工作了几天,真的找不到答案...... 我相信它很简单,但我找不到它...... 我已经遍布谷歌,并没有找到任何可以帮助我的东西(也许我不知道要搜索什么?)

注意:在文本中,占位符是{}

中的任何内容

所以我的问题:
我有一个字符串:
“{Prefix} {playerLeave}”

使用正则表达式,我需要找到{Prefix}用值替换它,然后检查新值是否有占位符等等。

在这种情况下,它会像这样:

  1. “{Prefix} {playerLeave}”

  2. “[征服]你离开了{kingdom}”

  3. “[征服]你离开了Celestra”

  4. 我尝试过(并且最远的)是:

    private static String translate(String text){
        try{
    
            while(text.matches("\\{(.*?)\\}")){
                Matcher match = Pattern.compile("\\\b{(.*?)\\}\b").matcher(text);
                while (match.find()) {
                    text = match(match.group(), text);
                }
            }
            if (text.matches("\\{(.*?)\\}"))
                translate(text);
            return text;
        }catch(Exception e) {
            e.printStackTrace();
            Bukkit.getConsoleSender().sendMessage(getMessage("&4ERROR: &cA placeholder failed!"));
            return "";
        }
    }       
    
    private static String match(String match, String text){
        text = text.contains("{Prefix}")    ? text.replace(match, String.valueOf(Cach.Prefix))              
        text = text.contains("{TeleportDelay}")     ? text.replace(match, String.valueOf(Cach.tpDelay))                                     : text.replace(match, "");
        text = text.contains("{town}")                  ? text.replace(match, String.valueOf(Cach.StaticTown.getName()))            : text.replace(match, "");
        text = text.contains("{village}")                   ? text.replace(match, String.valueOf(Cach.StaticVillage.getName()))         : text.replace(match, "");
        text = text.contains("{kingdom}")               ? text.replace(match, String.valueOf(Cach.StaticKingdom.getName()))         : text.replace(match, "");
        text = text.contains("{color}")                     ? text.replace(match, Cach.StaticKingdom.getColorSymbol())                  : text.replace(match, "");
        return text;
    }
    

    问题是它在某个程度上工作直到阶段 2.“[征服]你离开了{王国}” 如果我调试它就是sais:
    text.matches(“\ {(。*?)\}”)在此代码块中为false:

    if (text.matches("\\{(.*?)\\}"))
                translate(text);
    

    提前致谢!

    的问候,
    托马斯

1 个答案:

答案 0 :(得分:0)

此正则表达式Pattern.compile("\\\b{(.*?)\\}\b")出错:最后\b只有一个反斜杠。

再一次,你说:

  

我需要找到{Prefix}将其替换为值

但此行中的组仅匹配花括号内的文本(即前缀

因此,您找到的所有匹配项都包含没有大括号的组。

函数text.replace(match, ... )稍后执行的match将仅替换花括号内的文本。

如果我知道你的想法,我建议将这一行改为:

Pattern.compile("(\\{[^\\}]*\\})")