1

我有一个棘手的情况,似乎不起作用。对于给定的字符串,"Hi [HandleKey], you have [Action]"和包含的映射,map<"HandleKey","Peter">如果在映射中找到键,我想替换方括号和其中的单词。在这种情况下,映射不包含键 Action。字符串应该返回"Hi Peter, you have [Action]"

这是我正在处理的代码:

private String messageFormatter(String tMessage, Map<String, String> messageMap)
{
  String formattedMsg = null;
  Set<String> keyset = messageMap.keySet();

  Iterator<String> keySetItr = keyset.iterator();
  String msgkey = null;
  boolean isFormatted = false;
  while (keySetItr.hasNext())
  {
    msgkey = keySetItr.next();
    if(t.contains(msgkey))
    {
      if(!isFormatted)
      {
        formattedMsg = tMessage.replaceAll("\\[", "").replaceAll("\\]", "");
        formattedMsg = formattedMsg.replaceAll(msgkey, messageMap.get(msgkey));
        isFormatted= true;
      }else 
      {
        formattedMsg = formattedMsg.replaceAll(msgkey, messageMap.get(msgkey));;
      } 
    }else 
    {
      formattedMsg=tMessage;
    }
  }
  return formattedMsg;
}

最后一个else部分是不对的。谁能帮我解决这个问题。此代码适用于所有情况,除非在地图中找不到匹配的键

4

3 回答 3

1

这个想法适合你吗?

[..]您可以在地图方面做一些技巧,而不是应用正则表达式或提取 之间的东西。例如

String s = "Hi [HandleKey], you have [Action]";
for(String k: yourMap.keySet()){
  s=s.replaceAll("\\["+k+"\\]",yourMap.get(k));
}
于 2013-02-19T23:57:36.893 回答
1

你可以这样做regex,这是一个完整的示例代码

public static void main(String[] args) {
    String str = "Hi [HandleKey], you have [Action] ";
    Hashtable<String, String> table = new Hashtable<String, String>();
    table.put("HandleKey", "Peter");

    Pattern pattern = Pattern.compile("\\[(\\w+)\\]");
    Matcher matcher = pattern.matcher(str);
    while (matcher.find()) {
        String key = matcher.group(1);
        if (table.containsKey(key)) {
            str = str.replaceFirst("\\[" + key + "\\]", table.get(key));
        }
    }
    System.out.println(str);
}

输出:

嗨,彼得,你有 [行动]

请注意,如果地图大小已经很大或正在增长,这比循环遍历更有效。Map

于 2013-02-19T23:44:26.880 回答
0

要处理不在地图中的键,对上面的内容进行最小的更改,请尝试

formattedMsg.replaceAll(msgkey, 
   (messageMap.containsKey(msgKey) ? messageMap.get(msgkey) : "[" + msgKey + "]"));

但是再看一遍,我可以看到您正在从 messageMap 迭代键集,因此不会出现键未出现在地图中的问题?

还有对 if(t.contains(msgKey))... 的引用,但不确定 t 是什么

如果您希望文本在未找到时包含格式化的 [msgKey],那么如果您想在某些情况下将它们放回原处,则替换所有“[”和“]”似乎是错误的开始方式。

我会看看@iTech 的建议,让正则表达式为你做更多的事情

于 2013-02-19T23:44:18.270 回答