为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

皈依舞 2022-06-23 17:45:56
我目前正在构建一个 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,而不是“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());    }
查看完整描述

1 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

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


 "Weightlifting.*?foo/bar/(.*?)\""

                 |

                 ^ change this part

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


(?<=data-url=")[^\/]+\/[^\/]+\/(\d+)

  • (?<=data-url\s*=\s*")- 积极的回顾。检查data-url=

  • [^\/]+\/[^\/]+\/- 最多匹配两个文本/

  • (\d+)- 匹配数字一次或多次(您要捕获的 id)


查看完整回答
反对 回复 2022-06-23
  • 1 回答
  • 0 关注
  • 294 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号