Извлечь строку между двумя строками в 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;
  }