Java регулярное выражение между 2 символами включает новую строку или вкладку - PullRequest
0 голосов
/ 04 июля 2018

У меня проблема с регулярным выражением между 2 строками. Я хочу получить значение между строкой # и #, но это регулярное выражение не работает, когда у меня новая строка (в моем случае \r\n). например:

#89899#
#this is string I have
problem#

У меня проблема со строкой 2, потому что есть новая строка. как исключить новую строку в регулярных выражениях? мой код:

public static List parserStringBetween(String param1, String param2, String data) {
    List result = null;

    if (param1 != null && !"".equalsIgnoreCase(param1) && param2 != null && !"".equalsIgnoreCase(param2)
            && data != null && !"".equalsIgnoreCase(data)) {
        result = new ArrayList<>();
        Matcher m = Pattern.compile("\\" + param1 + "(.*?)\\" + param2).matcher(data);
        while (m.find()) {
            result.add(m.group(1));
        }

    }
    return result;
}

param1 и param2 являются строкой между настройками, т.е. здесь #. Как решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Добавьте флаг DOTALL через (?s):

Pattern.compile("\\Q" + param1 + "\\E(?s)(.*?)\\Q" + param2 + "\\E")

Обратите внимание также на использование \Q...\E для правильного экранирования. Просто добавьте обратную косую черту, чтобы она не сработала во всех случаях.

0 голосов
/ 04 июля 2018

Чтобы включить новую строку и пробелы , также используйте:

^#[\s\S]*#$

Проверьте это здесь, в действии .

Ваш код Java становится:

Matcher m = Pattern.compile("^" + param1 + "[\\s\\S]*" + param2 + "$").matcher(data);

Вы также можете использовать режим Pattern.DOTALL.

Matcher m = Pattern.compile("\\" + param1 + "(.*?)\\" + param2, Pattern.DOTALL).matcher(data);
...