gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:46:34 27 4
gpt4 key购买 nike

我目前正在构建一个 java 程序来自动预订每周定期的体育类(class),而不是手动预订。

为了实现此目的,我通过 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,而不是“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());
}

最佳答案

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

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

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

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

Demo

关于Java - 通过多行正则表达式匹配第一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54726250/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com