Java - 通过多行正则表达式匹配第一个字符串

问题描述 投票:1回答:1

我目前正在构建一个java程序,以自动化每周重复的体育课程预订,而不是手动预订。

为了实现这一点,我通过http get加载特定日期的类列表,并希望从响应中解析所需的类id(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>

到目前为止,下面的片段中的两个正则表达式是我能得到的最接近的,但它们都将匹配最后/第二个类ID,而不是“举重”一词之后的第一个。

    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());
    }
java regex
1个回答
0
投票

你的正则表达式是贪婪的,你需要让它变得懒惰。

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

您可以使用的另一种模式是这个

(?<=data-url=")[^\/]+\/[^\/]+\/(\d+)
  • (?<=data-url\s*=\s*") - 积极向后看。检查data-url=
  • [^\/]+\/[^\/]+\/ - 将文本与两个/匹配。
  • (\d+) - 匹配数字一次或多次(您要捕获的ID)

Demo

© www.soinside.com 2019 - 2024. All rights reserved.