문제

문자열을 취한 다음 문자열의 태그를 태그 라이브러리의 항목으로 바꾸는 서비스 메소드가 있습니다. 다음과 같이 :

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

확실히; 이것은 새로운 끈을 만들고 나쁘다. 그러나 StringBuilder 교체 방법은 하나의 문자열 내부의 여러 줄에 사용하는 것이 번거 롭습니다. 내 방법을 더 효율적으로 만들 수있는 방법은 무엇입니까?

다음과 같은 텍스트 블록과 함께 사용하기위한 것입니다.

Dear #FirstName #, #ApplicationType #에 대한 귀하의 응용 프로그램은 #승인되었습니다. #죄송합니다.

여기서 #FirstName #등은 메타 데이터 데이터베이스의 키입니다. 태그가 해시 문자로 둘러싸여 있지 않을 수도 있습니다.

도움이 되었습니까?

해결책 2

도움을 주셔서 감사합니다. 확실히 Java에 대해 더 많이 배웠습니다. 여기 내 해결책이 있습니다. 이 방법은 태그 내에서 다른 모양의 태그와 태그를 지원하는 방법입니다.

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

다른 팁

기본적으로 실행을 복사하려고합니다 matcher.replaceall () 그렇게 :

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

메모: 나는 유효한 태그 (즉, Regex의 w)에 대해 가정했습니다. 당신은 정말로 유효한 것을 위해 이것을 제공해야합니다 (예 : "#([ w _]+)#").

또한 위의 태그는 다음과 같은 것 같습니다.

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

그리고 그렇지 않다 :

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

두 번째가 올바른 경우 그에 따라 조정해야합니다.

이 방법은 메시지 문자열을 통해 정확히 하나의 패스를 만들어서 이것보다 훨씬 더 효율적이지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top