Java - сопоставить первую строку с помощью многострочного регулярного выражения - PullRequest
0 голосов
/ 16 февраля 2019

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

Для этого я загружаю список классов на определенную дату через http get ихотите проанализировать нужный идентификатор класса (foo / bar / class-id ) из ответа.

Сокращенный ответ выглядит так:

<div>
    <div class="row">
            Olympic Weightlifting <br>

            <a data-url="foo/bar/2099159">
                Book
            </a>
    </div>
    <div class="row">
            Fitness <br>

            <a data-url="foo/bar/2098939">
                Book
            </a>
    </div>
</div>

Пока чтодва регулярных выражения в фрагменте ниже - самые близкие, которые я мог бы получить, но они оба будут соответствовать последнему / второму идентификатору класса вместо первого после слова «Тяжелая атлетика».

    String str = "<div>\n" +
            "\t<div class=\"row\">\n" +
            "\t\t\tOlympic Weightlifting <br>\n" +
            "\n" +
            "\t\t\t<a data-url=\"foo/bar/2099159\">\n" +
            "\t\t\t\tBook\n" +
            "\t\t\t</a>\n" +
            "\t</div>\n" +
            "\t<div class=\"row\">\n" +
            "\t\t\tFitness <br>\n" +
            "\n" +
            "\t\t\t<a data-url=\"foo/bar/2098939\">\n" +
            "\t\t\t\tBook\n" +
            "\t\t\t</a>\n" +
            "\t</div>\n" +
            "</div>";


    // regex 1: pattern multiline
    Pattern p = Pattern.compile("Weightlifting.*foo/bar/(.*?)\"", Pattern.DOTALL);
    // regex 2: inline multiline
    // Pattern p = Pattern.compile("Weightlifting[\\s\\S]*foo/bar/(.*?)\"");
    Matcher m = p.matcher(str);

    if (m.find()) {
        System.out.println(m.group(1).trim());
    }

1 Ответ

0 голосов
/ 16 февраля 2019

хорошо, ваше регулярное выражение жадное, вам нужно сделать его ленивым.

 "Weightlifting.*?foo/bar/(.*?)\""
                 |
                 ^ change this part

Еще один шаблон, который вы можете использовать, это

(?<=data-url=")[^\/]+\/[^\/]+\/(\d+)
  • (?<=data-url\s*=\s*") - позитивный взгляд позади,проверяет data-url=
  • [^\/]+\/[^\/]+\/ - сопоставляет текст до двух /.
  • (\d+) - сопоставляет цифры один или несколько раз (идентификатор, который вы хотите захватить)

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...