2013-05-16 10 views
24

próbuję uzyskać ciąg między <% = i%>, tutaj jest moje wykonanie:Extract ciąg między dwa ciągi w Javie

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

powrót

[ZZZZL , AFFF ] 

Ale moje oczekiwania to:

[ dsn , AFG ] 

Gdzie się mylę i jak to poprawić?

+5

Wygląda na to, że wprowadzasz w błąd * dzielenie * ciągu znaków z dopasowaniem do wzorca. –

Odpowiedz

49

Twój wzór jest w porządku. Ale nie powinieneś być split() go usunąć, powinieneś find() go. Poniższy kod podaje wynik, którego szukasz:

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

Twój regex wygląda poprawnie, ale jesteś z nim zamiast z matching. Chcesz coś takiego:

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

Podejście Jlordo obejmuje określoną sytuację. Jeśli spróbujesz zbudować metodę abstrakcyjną, możesz napotkać trudności, aby sprawdzić, czy "textFrom" jest przed "textTo". W przeciwnym razie metoda może zwrócić dopasowanie dla innego wystąpienia "textFrom" w tekście.

Tutaj jest gotowy do przejść abstrakcyjny sposób, że obejmuje tę wadę:

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