Строка Java - получить все между (но не включая) двумя регулярными выражениями?

В Java есть простой способ извлечь подстроку, указав ограничители регулярных выражений с обеих сторон, без включения разделителей в конечной подстроке?

Например, если у меня есть строка вроде этого:

<row><column>Header text</column></row>

что является самым простым способом извлечения подстроки:

Header text

Обратите внимание, что подстрока может содержать разрывы строк...

спасибо!

Ответ 1

Напишите регулярное выражение следующим образом:

"(regex1)(.*)(regex2)"

... и вытащите среднюю группу из матчи (чтобы обрабатывать новые строки в вашем шаблоне, который вы хотите использовать Pattern.DOTALL).

Используя ваш пример, мы можем написать такую ​​программу, как:

package test;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Regex {

    public static void main(String[] args) {
        Pattern p = Pattern.compile(
                "<row><column>(.*)</column></row>",
                Pattern.DOTALL
            );

        Matcher matcher = p.matcher(
                "<row><column>Header\n\n\ntext</column></row>"
            );

        if(matcher.matches()){
            System.out.println(matcher.group(1));
        }
    }

}

Что при печати распечатывается:

Header


text

Ответ 2

Вы не должны использовать регулярные выражения для декодирования XML - это в конечном итоге сломается, если вход не будет строго контролироваться.

Проще всего, возможно, проанализировать XML в дереве DOM (Java 1.4 и более поздние из них содержат синтаксический анализатор XML напрямую), а затем перемещаться по дереву, чтобы выбрать, что вам нужно.

Возможно, вы хотели бы рассказать, что вы хотите выполнить с вашей программой?