2013-05-16 3 views
24

я стараюсь, чтобы получить строку между <% = и%>, вот моя реализация:Извлечение строки между двумя строками в Java

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

это вернуть

[ZZZZL , AFFF ] 

Но мое ожидание:

[ dsn , AFG ] 

Где я ошибаюсь и как ее исправить?

+5

Похоже, вы сбиваете с толку * разбивая * строку с совпадением рисунков. –

ответ

49

Ваш шаблон в порядке. Но вы не должны быть split() ting его, вы должны find() это. Следующий код дает результат, который вы ищете:

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

Ваше регулярное выражение выглядит правильно, но вы с ним splitting вместо matching. Вы хотите что-то вроде этого:

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

Jlordo подход охватывает конкретную ситуацию. Если вы попытаетесь создать из него абстрактный метод, вы можете столкнуться с трудностями, чтобы проверить, есть ли «textFrom» до «textTo». В противном случае метод может возвращать соответствие для некоторого другого события 'textFrom' в тексте.

Вот готовый к использованию абстрактный метод, который покрывает этот недостаток:

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

Я ответил на этот вопрос здесь: https://stackoverflow.com/a/38238785/1773972

В основном используют

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

This requirs используя библиотеку «Apache commons lang»: https://mvnrepository.com/artifact/org.apache.commons/commons-lang3/3.4

В этой библиотеке есть много полезных методов для работы со строкой, вам будет полезно изучить эту библиотеку в других областях вашего Java-кода !!!