Извлечь строку между двумя строками в 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 ]
Где я ошибаюсь и как ее исправить?
Ответы
Ответ 1
Ваш образец в порядке. Но вы не должны split()
его на части, вы должны find()
его. Следующий код дает вывод, который вы ищете:
String str = "ZZZZL <%= dsn %> AFFF <%= AFG %>";
Pattern pattern = Pattern.compile("<%=(.*?)%>", Pattern.DOTALL);
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.println(matcher.group(1));
}
Ответ 2
Я ответил на этот вопрос здесь: fooobar.com/questions/121814/...
В основном использовать
StringUtils.substringBetween(str, "<%=", "%>");
Это требует использования библиотеки "Apache commons lang": https://mvnrepository.com/artifact/org.apache.commons/commons-lang3/3.4
В этой библиотеке есть много полезных методов для работы со строкой, вам действительно удастся изучить эту библиотеку в других областях вашего Java-кода !!!
Ответ 3
Ваше регулярное выражение выглядит правильно, но вы splitting
его, а не matching
с ним. Вы хотите что-то вроде этого:
// Untested code
Matcher matcher = Pattern.compile("<%=(.*?)%>").matcher(str);
while (matcher.find()) {
System.out.println(matcher.group());
}
Ответ 4
Подход 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;
}