2012-03-07 34 views
6

Tôi đang cố tìm các biến môi trường trong đầu vào và thay thế chúng bằng các giá trị.Biểu thức chính quy java tìm và thay thế

Các mô hình của biến env là ${\\.}

Pattern myPattern = Pattern.compile("(${\\.})"); 
String line ="${env1}sojods${env2}${env3}"; 

Làm thế nào tôi có thể thay thế env1 với 1env2 với 2env3 với 3, vì vậy rằng sau này tôi sẽ có một chuỗi mới 1sojods23?

+0

Ví dụ của bạn đề xuất mẫu phải là '$ {[^}] +}' hoặc tương tự thay vì '$ {\\.}'. –

+0

Mục đích là thu gọn 'envN' xuống 'N' hay để thay thế 'envN' bằng giá trị được gán cho envN trong thuộc tính môi trường/hệ thống? –

Trả lời

-1

Sử dụng nhóm sau khi nhóm được đối sánh ${env1} sẽ là nhóm đầu tiên của bạn và sau đó bạn sử dụng regex để thay thế những gì có trong mỗi nhóm.

Pattern p = Pattern.compile("(${\\.})"); 
Matcher m = p.matcher(line); 
while (m.find()) 
    for (int j = 0; j <= m.groupCount(); j++) 
    //here you do replacement - check on the net how to do it;) 
+0

Tôi đã thử mẫu này nhưng có ngoại lệ sau: Ngoại lệ trong chủ đề "chính" java.util.regex.PatternSyntaxException: Lặp lại bất hợp pháp gần chỉ mục 1 ($ {\.}) – user1205079

1

Hy vọng rằng bạn sẽ tìm thấy mã này hữu ích:

Pattern phone = Pattern.compile("\\$\\{env([0-9]+)\\}"); 
    String line ="${env1}sojods${env2}${env3}"; 
    Matcher action = phone.matcher(line); 
    StringBuffer sb = new StringBuffer(line.length()); 
    while (action.find()) { 
     String text = action.group(1); 
     action.appendReplacement(sb, Matcher.quoteReplacement(text)); 
    } 
    action.appendTail(sb); 
    System.out.println(sb.toString()); 

Kết quả là mong đợi: 1sojods23.

+0

how about var name is env_a, env_b and env_c ? – Kent

+0

Ok không có mô hình nào của nhóm có thể được thay đổi. Tôi chỉ nhắm vào câu hỏi rất cụ thể của OP, nhưng tôi đoán anh ta có thể thay đổi mô hình cho phù hợp (sau khi tất cả các đặc điểm kỹ thuật không được đưa ra). –

+0

đặc biệt Cảm ơn thực sự cảm ơn vì câu trả lời nhanh của bạn và đó là câu trả lời thực sự tuyệt vời. – user1205079

2

này mang đến cho bạn 1sojods23:

String s = "${env1}sojods${env2}${env3}"; 
final Pattern myPattern = Pattern.compile("\\$\\{[^\\}]*\\}"); 
Matcher m = myPattern.matcher(s); 
int i = 0; 
while (m.find()) { 
    s = m.replaceFirst(String.valueOf(++i)); 
    m = myPattern.matcher(s); 
} 

System.out.println(s); 

và các công trình này quá:

final String re = "\\$\\{[^\\}]*\\}"; 
String s = "${env1}sojods${env2}${env3}"; 
int i = 0; 
String t; 
while (true) { 
    t = s.replaceFirst(re, String.valueOf(++i)); 
    if (s.equals(t)) { 
     break; 
    } else { 
     s = t; 
    } 
} 

System.out.println(s); 
30

Strings trong Java là không thay đổi, mà làm này hơi phức tạp nếu bạn đang nói về một số bất kỳ điều bạn cần tìm và thay thế.

Cụ thể bạn cần xác định thay thế của bạn trong một Map, sử dụng một StringBufferappendReplacements()appendTail() phương pháp từ Matcher. Kết quả cuối cùng sẽ được lưu trữ trong số StringBuffer của bạn.

Map<String, String> replacements = new HashMap<String, String>() {{ 
    put("${env1}", "1"); 
    put("${env2}", "2"); 
    put("${env3}", "3"); 
}}; 

String line ="${env1}sojods${env2}${env3}"; 
String rx = "(\\$\\{[^}]+\\})"; 

StringBuffer sb = new StringBuffer(); 
Pattern p = Pattern.compile(rx); 
Matcher m = p.matcher(line); 

while (m.find()) 
{ 
    // Avoids throwing a NullPointerException in the case that you 
    // Don't have a replacement defined in the map for the match 
    String repString = replacements.get(m.group(1)); 
    if (repString != null)  
     m.appendReplacement(sb, repString); 
} 
m.appendTail(sb); 

System.out.println(sb.toString()); 

Output:

1sojods23 
+0

một cái gì đó sai trong mã – jjLin

+1

Đẹp và thanh lịch ... và nghĩ rằng tôi đã có rất nhiều mã xấu xí ra có cố gắng để làm tương tự bằng cách sử dụng hoạt động chuỗi cơ bản ... Làm chính xác như nhau ... Bản đồ và tất cả, thay thế $ {biến } ... thời gian cho một số dọn dẹp của tôi. – YoYo

+0

Để thay thế ví dụ này: "$ #, ## 0.0" thành "$" #, ## 0.0 " Sử dụng Matcher.quoteReplacement (...) Vì vậy, bạn nhận được: if (replace! = Null) { Chuỗi rp = Matcher.quoteReplacement ("\ '" + thay thế + "\'"); matcher.appendReplacement (sb, rp); } –

7

Tôi biết điều này là cũ, tôi đã tự tìm kiếm một appendReplacement/appendTail dụ khi tôi tìm thấy nó; Tuy nhiên, câu hỏi của OP không cần những giải pháp đa dòng phức tạp mà tôi đã thấy ở đây.

Trong trường hợp này chính xác, khi chuỗi để thay thế nắm giữ bản thân giá trị chúng ta muốn thay thế, sau đó điều này có thể được thực hiện dễ dàng với replaceAll:

String line ="${env1}sojods${env2}${env3}"; 

System.out.println(line.replaceAll("\\$\\{env([0-9]+)\\}", "$1")); 

// Output => 1sojods23 

DEMO

Khi thay thế là ngẫu nhiên dựa trên một số điều kiện hoặc logic trên mỗi trận đấu, khi đó bạn có thể sử dụng appendReplacement/appendTail ví dụ:

0

Bạn có thể sử dụng StringBuffer kết hợp với phương thức appendReplacement() của Matcher, nhưng nếu mẫu không khớp, không có điểm nào trong việc tạo StringBuffer.

Ví dụ: đây là mẫu phù hợp với $ {...}. Nhóm 1 là nội dung giữa các niềng răng.

static Pattern rxTemplate = Pattern.compile("\\$\\{([^}\\s]+)\\}"); 

Và đây là chức năng mẫu sử dụng mẫu đó.

private static String replaceTemplateString(String text) { 
    StringBuffer sb = null; 
    Matcher m = rxTemplate.matcher(text); 
    while (m.find()) { 
     String t = m.group(1); 
     t = t.toUpperCase(); // LOOKUP YOUR REPLACEMENT HERE 

     if (sb == null) { 
      sb = new StringBuffer(text.length()); 
     } 
     m.appendReplacement(sb, t); 
    } 
    if (sb == null) { 
     return text; 
    } else { 
     m.appendTail(sb); 
     return sb.toString(); 
    } 
} 
Các vấn đề liên quan