2014-10-06 2 views
2

${...}으로 묶인 문자열을 검색하고 해당 문자열을 ${...}을 바꾸는 데 사용할 값이 들어있는 HashMap의 키로 사용하고 싶습니다. 다음 예에서Java에서 HashMap의 키로 문자열 대체의 역 참조를 사용하는 방법은 무엇입니까?

는 문자열 Master_${field1}_${field2}_EndMaster_slave1_slave2_End로 변환되어야한다

package com.stackoverflow; 

import java.util.HashMap; 
import java.util.Map; 

public class RegExReplace { 

    public static void main(String[] args) { 
//  String string = "Master_${field1}_${field2}_${nonexisting}_End"; 
     String string = "Master_${field1}_${field2}_End"; 
     Map<String, String> toBeInserted = new HashMap<String, String>(); 
     toBeInserted.put("field1", "slave1"); 
     toBeInserted.put("field2", "slave2"); 
     toBeInserted.put("field3", "slave3"); 

     String pattern = "\\$\\{([a-zA-Z0-9\\-_]*)\\}"; 
     String replace = "$1"; 

//  System.out.println(string.replaceAll(pattern, replace)); 
     System.out.println(string.replaceAll(pattern, toBeInserted.get(replace))); 

    } // END: main() 

} // END: class 

것이 가능하다 (방법)에서, HashMap에 대한 역 참조 키로서 사용 하는가?

+0

다른 문자열을 만들 수 있습니다 :'String mapKey = string.replaceAll (pattern, "$ 1")'그리고 두번째 대체에서'mapKey'를 사용하십시오 – BackSlash

답변

3

당신은 PatternStringBuffer가 대체를 추가하는 방법의 일치를 통해 반복 사용할 수 있습니다, 같은 :

String string = "Master_${field1}_${field2}_End"; 
Map<String, String> toBeInserted = new HashMap<String, String>(); 
toBeInserted.put("field1", "slave1"); 
toBeInserted.put("field2", "slave2"); 
toBeInserted.put("field3", "slave3"); 

Pattern p = Pattern.compile("\\$\\{(.+?)\\}"); 
Matcher m = p.matcher(string); 
StringBuffer sb = new StringBuffer(); 
while (m.find()) { 
    String key = m.group(1); 
    if (key != null) { 
     String value = toBeInserted.get(key); 
     if (value != null) 
      m.appendReplacement(sb, value); 
    } 
} 
m.appendTail(sb); 
System.out.println(sb.toString()); 

출력

Master_slave1_slave2_End 
2

올바른 길을 가고 정규 표현식이 좋아 보인다.

이제 다음 단계는 다음과 같습니다

  1. Pattern 객체
  2. 을 만들어 컴파일 Pattern 객체에 문자열 입력에 while (matcher.find()) {...} (즉 Matcher matcher = pattern.matcher(stringInput))
  3. 실행을 전달하여 Matcher 인스턴스를 생성하는 문자열 정규식을 컴파일 루프
  4. 내부 루프 matcher.group(1) (예 : 역 참조)을의 키로 사용하십시오.

모두를 퍼팅 :

Pattern p = Pattern.compile(pattern); 
Matcher m = p.matcher(string); 
StringBuffer sb = new StringBuffer(); 
while(m.find()) { 
    m.appendReplacement(sb, toBeInserted.get(m.group(1))); 
} 
m.appendTail(sb); 

System.out.println("Converted string is: " + sb.toString());