Vra

Ek het 'n diens metode wat 'n String neem en dan vervang tags in die String met items uit 'n tag biblioteek. Soos volg:

for( MetaDataDTO tag : tagValues )
{
    message = message.replace( tag.getKey(), tag.getText1() );
}

Dit is duidelik dat, hierdie maak hope nuwe snare en sleg is. Maar die StringBuilder vervang metode is omslagtig om te gebruik vir verskeie snare binne een string. Hoe kan ek my metode meer doeltreffend?

Dit is vir gebruik met blokke teks soos:

Geagte # firstName #, jou aansoek vir # applicationType # is # approvedRejected # jammer.

Waar # firstName #, ens is die sleutels in 'n meta data databasis. Dit is ook moontlik dat etikette nie kan omring deur hash karakters.

Was dit nuttig?

Oplossing 2

Dankie vir jou hulp ouens. Beslis meer geleer oor Java. Hier is my oplossing. Dit is op hierdie manier te verskil op soek etikette en etikette binne tags ondersteun:

private static String replaceAllTags(String message, Map< String, String > tags)
{
    StringBuilder sb = new StringBuilder( message );
    boolean tagFound = false;
    /**
     * prevent endless circular text replacement loops
     */
    long recurrancyChecker = 5000;

    do
    {
        tagFound = false;
        Iterator it = tags.entrySet().iterator();
        while( it.hasNext() )
        {
            Map.Entry pairs = (Map.Entry) it.next();

            int start = sb.indexOf( pairs.getKey().toString() );

            while( start > -1 && --recurrancyChecker > 0 )
            {
                int length = pairs.getKey().toString().length();
                sb.replace( start, start + length, pairs.getValue().toString() );
                start = sb.indexOf( pairs.getKey().toString() );
                tagFound = true;
            }
        }
    }
    while( tagFound && --recurrancyChecker > 0 );
    return sb.toString();
}

Ander wenke

Basies wat jy wil die uitvoering van Matcher.replaceAll () soos so:

public static String replaceTags(String message, Map<String, String> tags) {
  Pattern p = Pattern.compile("#(\\w+)#");
  Matcher m = p.matcher(message);
  boolean result = m.find();
  if (result) {
    StringBuffer sb = new StringBuffer();
    do {
      m.appendReplacement(sb, tags.containsKey(m.group(1) ? tags.get(m.group(1)) : "");
      result = m.find();
    } while (result);
    m.appendTail(sb);
    message = sb.toString();
  }
  return message;
}

Nota: Ek het 'n aanname oor die geldige etiket (naamlik \ w in die regex) gemaak. Jy sal nodig hê om hierdie voorsiening te maak vir dit wat regtig geldig (bv "# ([\ w _] +) #").

Ek het ook aanvaar die etikette bo lyk iets soos:

Map<String, String> tags = new HashMap<String, String>();
tags.add("firstName", "Skippy");

en nie:

tags.add("#firstName#", "Skippy");

As die tweede korrek is wat jy nodig het om aan te pas.

Hierdie metode maak presies een pass regoor die boodskap string sodat dit nie veel meer doeltreffend as dit kry.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top