2013-05-16 50 views
24

tôi cố gắng để có được chuỗi giữa <% = và%>, đây là thực hiện của tôi:Extract chuỗi giữa hai chuỗi trong java

String str = "ZZZZL <%= dsn %> AFFF <%= AFG %>"; 
Pattern pattern = Pattern.compile("<%=(.*?)%>"); 
String[] result = pattern.split(str); 
System.out.println(Arrays.toString(result)); 

nó trở

[ZZZZL , AFFF ] 

Nhưng kỳ vọng của tôi là:

[ dsn , AFG ] 

Tôi sai và cách sửa lỗi ở đâu?

+5

Dường như bạn đang bối rối * tách * một chuỗi có đối sánh mẫu. –

Trả lời

49

Mẫu của bạn vẫn ổn. Nhưng bạn không nên để split() giải quyết nó đi, bạn nên find() nó. Mã sau cung cấp kết quả bạn đang tìm kiếm:

String str = "ZZZZL <%= dsn %> AFFF <%= AFG %>"; 
Pattern pattern = Pattern.compile("<%=(.*?)%>"); 
Matcher matcher = pattern.matcher(str); 
while (matcher.find()) { 
    System.out.println(matcher.group(1)); 
} 
3

Regex của bạn có vẻ chính xác, nhưng bạn là splitting với thay vì matching cùng với nó. Bạn muốn một cái gì đó như thế này:

// Untested code 
Matcher matcher = Pattern.compile("<%=(.*?)%>").matcher(str); 
while (matcher.find()) { 
    System.out.println(matcher.group()); 
} 
1

Cách tiếp cận Jlordo bao gồm tình huống cụ thể. Nếu bạn cố gắng xây dựng phương pháp trừu tượng, bạn có thể gặp khó khăn khi kiểm tra xem 'textFrom' có trước 'textTo' hay không. Nếu không, phương thức có thể trả lại kết quả khớp cho một số lần xuất hiện khác 'textFrom' trong văn bản.

Dưới đây là một phương pháp trừu tượng sẵn sàng để đi che nhược điểm này:

/** 
    * Get text between two strings. Passed limiting strings are not 
    * included into result. 
    * 
    * @param text  Text to search in. 
    * @param textFrom Text to start cutting from (exclusive). 
    * @param textTo Text to stop cuutting at (exclusive). 
    */ 
    public static String getBetweenStrings(
    String text, 
    String textFrom, 
    String textTo) { 

    String result = ""; 

    // Cut the beginning of the text to not occasionally meet a  
    // 'textTo' value in it: 
    result = 
     text.substring(
     text.indexOf(textFrom) + textFrom.length(), 
     text.length()); 

    // Cut the excessive ending of the text: 
    result = 
     result.substring(
     0, 
     result.indexOf(textTo)); 

    return result; 
    } 
14

Tôi đã trả lời câu hỏi này ở đây: https://stackoverflow.com/a/38238785/1773972

Về cơ bản sử dụng

StringUtils.substringBetween(str, "<%=", "%>"); 

requirs này sử dụng thư viện "Apache commons lang": https://mvnrepository.com/artifact/org.apache.commons/commons-lang3/3.4

Thư viện này có rất nhiều phương pháp hữu ích để làm việc với chuỗi, bạn sẽ thực sự được hưởng lợi từ việc khám phá thư viện này trong các khu vực khác của mã java của bạn !!!

Các vấn đề liên quan