【问题标题】:Java - Match first string via multiline regexJava - 通过多行正则表达式匹配第一个字符串
【发布时间】:2019-07-10 14:18:03
【问题描述】:

我目前正在构建一个 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>

到目前为止,下面 sn-p 中的两个正则表达式是我能得到的最接近的,但它们都将匹配最后一个/第二个类 id,而不是“Weightlifting”一词后面的第一个。

    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());
    }

【问题讨论】:

  • 使用Pattern.compile("data-url=\"[^/\"]+/[^\"/]+/(\\d+)")。如果您需要所有匹配项,请将 if (m.find()) 替换为 while (m.find())
  • 谢谢,我需要依靠班级名称来获取我要预订的班级的具体ID。但我想我会用斜线部分调整我的正则表达式,谢谢!

标签: java regex


【解决方案1】:

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

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

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

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

Demo

【讨论】:

  • 哦,非常感谢,帮了大忙!我不能使用的data-url,因为我只需要特定类的id,并且可以有n个不同类型的类。但这很有帮助!
  • @MaxPower 哦,我明白了。在您的输入中,这似乎是一种模式,所以我考虑了这一点。您可以轻松更改该部分
猜你喜欢
  • 2015-04-09
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 2015-09-02
  • 2013-10-14
  • 1970-01-01
相关资源
最近更新 更多