SPA
SPA

Reputation: 29

How to replace a word within a square bracket based a certain condition

I've a tricky condition which does not seem to work. For a given string, "Hi [HandleKey], you have [Action]", and a map which contains, map<"HandleKey","Peter"> I want to replace the square bracket and the word within if the key is found in the map. In this case, the map does not contain the key Action. The string should return "Hi Peter, you have [Action]".

Here is the code that I'm working on:

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

The last else part is not right. Can anyone please help me with this. This code works fine for all the cases except when a matching key is not found in the map

Upvotes: 1

Views: 828

Answers (3)

iTech
iTech

Reputation: 18440

You can do this with regex, here is a complete example code

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

Output:

Hi Peter, you have [Action]

Note that this is more efficient than looping over the Map if the map size is already large or growing.

Upvotes: 1

Kent
Kent

Reputation: 195039

is this idea ok for you?

instead of applying regex or extracting the stuff between [..], you could do some trick on your map side. e.g.

String s = "Hi [HandleKey], you have [Action]";
for(String k: yourMap.keySet()){
  s=s.replaceAll("\\["+k+"\\]",yourMap.get(k));
}

Upvotes: 1

MadMurf
MadMurf

Reputation: 2313

To handle when key not in map with minimal changes to what you have above try

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

but looking again I can see that you're iterating the set of keys from the messageMap so the issue of a key not appearing in the map doesn't arise?

There's also a reference to if(t.contains(msgKey))... but not sure what t is

if you want the text to contain the formatted [msgKey] when its no found then replacing all "[" & "]" seems the wrong way to start if you want to put them back in in some cases.

I'd look at @iTech's suggestion and get regex doing more for you

Upvotes: 0

Related Questions