java - Replacing portions of a long string with different values -


i have string below;

string texttoshow = "appplication [%applicationname%]: started @ [%date%][%time%]"

where need replace strings in between [% , %] different values.

i did below, works first 1 i.e. "applicationname".

private string gettextvariablename(string stringtoshow) {     if (stringtoshow.contains("[%") && stringtoshow.contains("%]")) {         string content[] = notificationtext.split("%");         return content[1];     }     return null; }  private string replacevalue(string stringtoshow, string datatoreplace) {     return stringtoshow.substring(0, stringtoshow.indexof("["))             + datatoreplace             + stringtoshow.substring(stringtoshow.indexof("]") + 1, stringtoshow.length()); }  public string processtext(string stringtoshow, string appname) {     string variablename = gettextvariablename(stringtoshow);     string processedtext = "invalid";     if (variablename != null) {         switch (variablename.tolowercase()) {          case "applicationname":             processedtext = replacevalue(stringtoshow, appname);             break;          case "datetime":             localdatetime currentdatetime = localdatetime.now();             string formattedcurrentdatetime = currentdatetime                     .format(datetimeformatter                             .ofpattern("yyyy-mm-dd hh:mm:ss"));             processedtext = replacevalue(stringtoshow,                     formattedcurrentdatetime);             break;          case "date":             localdate currentdate = localdate.now();             string formattedcurrentdate = currentdate                     .format(datetimeformatter.ofpattern("yyyy-mm-dd"));             processedtext = replacevalue(stringtoshow,                     formattedcurrentdate);             break;          case "time":             localtime currenttime = localtime.now();             string formattedcurrenttime = currenttime                     .format(datetimeformatter.ofpattern("hh:mm:ss"));             processedtext = replacevalue(notificationtext,                     formattedcurrenttime);             break;          default:             processedtext = "invalid";             break;         }     }     return processedtext; } 

how can make work whole string without splitting further , further if there more portions similar these appear?

is there better method without splitting?

note: string database, cannot change string. need replace portions between [% , %] according name of string. like, if date, must replace date , on.

the regular expression api offers required logic, can use replace arbitrary number of variables in string efficiently, see appendreplacement , appendtail:

public string processtext(string stringtoshow, string appname) {     matcher m=pattern.compile("\\[%(\\w+)%\\]").matcher(stringtoshow);     if(!m.find()) return stringtoshow;     stringbuffer sb=new stringbuffer();     {         string replacement;         switch(m.group(1).tolowercase(locale.root)) {             case "applicationname":                 replacement=appname;                 break;             case "datetime":                 replacement = localdatetime.now().format(                     datetimeformatter.ofpattern("yyyy-mm-dd hh:mm:ss"));                 break;             case "date":                 replacement = localdate.now().format(                     datetimeformatter.ofpattern("yyyy-mm-dd"));                 break;             case "time":                 replacement = localtime.now().format(                     datetimeformatter.ofpattern("hh:mm:ss"));                 break;             default:                 replacement = "invalid";         }         m.appendreplacement(sb, replacement);     } while(m.find());     return m.appendtail(sb).tostring(); } 

note api missed introduction of stringbuilder, have use stringbuffer here. that’s solved in java 9.


note appendreplacement assigns special meaning $ , \ characters if occur in replacement string. if suspect them appear in replacement string want insert string literally, quotereplacement can used, i.e. m.appendreplacement(sb, matcher.quotereplacement( replacement));.


Comments