2013-06-27 29 views
5

Tôi sẽ nhận được các chuỗi có chứa các thuộc tính "được định dạng"; tức là, Chuỗi được đóng gói bên trong mã thông báo "$ {" và "}" chuẩn:Tìm kiếm và thay thế các thuộc tính được định dạng bên trong chuỗi Java

"Đây là $ {example} của $ {string} mà tôi có thể là $ {given}".

tôi cũng sẽ có một HashMap<String,String> thay chứa cho mỗi thể định dạng tài sản:

HashMap Keys   HashMapValues 
=========================================== 
bacon     eggs 
ham     salads 

Vì vậy mà, với chuỗi sau:

"Tôi thích ăn $ {thịt xông khói} và $ {ham}. "

tôi có thể gửi thông điệp này đến một phương pháp Java mà sẽ biến nó thành: "Tôi thích ăn trứng và salad"

Đây là nỗ lực của tôi tốt nhất:

System.out.println("Starting..."); 

String regex = "$\\{*\\}"; 
Map<String,String> map = new HashMap<String, String>(); 
map.put("bacon", "eggs"); 
map.put("ham", "salads"); 

String sampleString = "I like ${bacon} and ${ham}."; 

Pattern pattern = Pattern.compile(regex); 
Matcher matcher = pattern.matcher(sampleString); 
while(matcher.find()) { 
    System.out.println("Found " + matcher.group()); 

    // Strip leading "${" and trailing "}" off. 
    String property = matcher.group(); 

    if(property.startsWith("${")) 
     property = property.substring(2); 
    if(property.endsWith("}")) 
     property = property.substring(0, property.length() - 1); 

    System.out.println("Before being replaced, property is: " + property); 

    if(map.containsKey(property)) 
     property = map.get(property); 

    // Now, not sure how to locate the original property ("${bacon}", etc.) 
    // inside the sampleString so that I can replace "${bacon}" with 
    // "eggs". 
} 

System.out.println("Ending..."); 

Khi tôi thực hiện điều này, tôi nhận được không có lỗi, nhưng chỉ cần nhìn thấy "Bắt đầu ..." và "Kết thúc ..." đầu ra. Điều này cho tôi biết rằng regex của tôi không chính xác và do đó, Matcher không thể khớp với bất kỳ thuộc tính nào.

Vì vậy, câu hỏi đầu tiên của tôi là: regex này nên là gì?

Khi tôi đã qua, tôi không chắc chắn cách thực hiện chuỗi thay thế khi tôi đã thay đổi "$ {bacon}" thành "trứng", v.v. Bất kỳ ý tưởng nào? Cảm ơn trước!

+0

Đang cố gắng để giải quyết vấn đề này với RegEx (nếu có thể ở tất cả ...) là một bài tập academical, "trong thực tế thế giới "bạn nên sử dụng động cơ như vd http://freemarker.sourceforge.net –

Trả lời

3

Sử dụng này để thay thế:

String regex = "\\$\\{([^}]*)\\}"; 

Sau đó, bạn có được chỉ là nội dung giữa ${} đó là bên trong nhóm chụp 1.

Lưu ý rằng $ như một ý nghĩa đặc biệt trong một mô hình: kết thúc của chuỗi
Vì vậy, nó bị bỏ qua để được xem là chữ (như dấu ngoặc nhọn).

+0

+1, Bạn nói đúng, đang xóa nhận xét của tôi. – jlordo

6

Tại sao không sử dụng một tập tin .properties ?, cách mà bạn có thể nhận được tất cả các tin nhắn của bạn từ tập tin đó và có thể được tách biệt với mã của bạn, một cái gì đó tương tự (example.properties tập tin):

message1=This is a {0} with format markers on it {1} 

và sau đó trong lớp học của bạn tải bó của bạn và sử dụng nó như thế này:

ResourceBundle bundle = ResourceBundle.getBundle("example.properties", Locale.getDefault()); 
MessageFormat.format(bundle.getString('message1'), "param0", "param1"); // This gonna be your formatted String "This is a param0 with format markers on it param1" 

bạn có thể sử dụng MessageFormat (là một thư viện java.util) mà không có sự bó (chỉ cần sử dụng chuỗi trực tiếp), nhưng một lần nữa, có một gói làm cho mã của bạn rõ ràng (và mang lại quốc tế hóa dễ dàng)

1

Sử dụng tốt hơn StrSubstitutor từ apache commons lang.Nó cũng có thể hệ thống thay thế đạo cụ

0

Đối hoàn thành, đây là một giải pháp làm việc:

static final Pattern EXPRESSION_PATTERN = Pattern.compile("\\$\\{([^}]*)\\}"); 

/** 
* Replace ${properties} in an expression 
* @param expression expression string 
* @param properties property map 
* @return resolved expression string 
*/ 
static String resolveExpression(String expression, Map<String, String> properties) { 
    StringBuilder result = new StringBuilder(expression.length()); 
    int i = 0; 
    Matcher matcher = EXPRESSION_PATTERN.matcher(expression); 
    while(matcher.find()) { 
     // Strip leading "${" and trailing "}" off. 
     result.append(expression.substring(i, matcher.start())); 
     String property = matcher.group(); 
     property = property.substring(2, property.length() - 1); 
     if(properties.containsKey(property)) { 
      //look up property and replace 
      property = properties.get(property); 
     } else { 
      //property not found, don't replace 
      property = matcher.group(); 
     } 
     result.append(property); 
     i = matcher.end(); 
    } 
    result.append(expression.substring(i)); 
    return result.toString(); 
} 
Các vấn đề liên quan