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
Post a Comment