gpt4 book ai didi

javascript - RegExp 适用于 JS 和 PHP 但不适用于 Java

转载 作者:行者123 更新时间:2023-11-29 20:46:35 25 4
gpt4 key购买 nike

我有一个正则表达式可以从 HTML 源代码中提取一个 id 和一个标签。可以查到HERE .

如您所见,它运行良好且速度很快,但是当我在 Java 中使用相同的源代码尝试此正则表达式时,它 1. 永远有效 2. 仅匹配一个字符串(从第一个 a 到最后一个 a 是一个匹配)。

我尝试打开和关闭 Multiline 标志,但没有区别。我不明白正则表达式如何在除 Java 之外的任何地方工作。有什么想法吗?

private static final String COURSE_REGEX = "<a class=\"list-group-item list-group-item-action \" href=\"https:\\/\\/moodle-hs-ulm\\.de\\/course\\/view\\.php\\?id=([0-9]*)\"(?:.*\\s){7}<span class=\"media-body \">([^<]*)<\\/span>";

Pattern pattern = Pattern.compile(COURSE_REGEX, Pattern.MULTILINE);
Matcher matcher = pattern.matcher(sourceCode);
List<String> courses = new ArrayList<>();

while(matcher.find() && matcher.groupCount() == 2){
courses.add(matcher.group(1) + "(" + matcher.group(2) + ")");
}

最佳答案

您的正则表达式遇到了 catastrophic backtracking由于子表达式 (?:.*\s){7} 的可能排列数量巨大需要检查(因为 . 也可以匹配空格)。 Java 在一定数量的步骤后中止匹配尝试(不确定有多少,肯定 > 1.000.000)。 PHP 或 JS 可能没有那么谨慎。

如果您将正则表达式的那部分简化为 .*? ,你确实得到了比赛:

"(?s)<a class=\"list-group-item list-group-item-action \" href=\"https://moodle-hs-ulm\\.de/course/view\\.php\\?id=([0-9]*)\".*?<span class=\"media-body \">([^<]*)</span>"

请注意,您需要 DOTALL标志( (?s) ,所以 . 可能匹配换行符)而不是 MULTILINE改变 ^ 行为的标志和 $ anchor (您的正则表达式未使用任何 anchor )。

另请注意,您不需要在 Java 正则表达式中转义斜杠。

这个解决方案不是很可靠,因为 .*?是相当不具体的。我想你之前尝试过 (?:.*\\s){7}可能被设计为匹配不超过 7 行的文本?在这种情况下,您可以使用 (?:(?!</a>).)*相反,以确保您不会进入下一个 <a>标签。这是使用正则表达式解析 HTML 的危险之一:)

最后,来自贵校信息学系工作人员的问候:)

关于javascript - RegExp 适用于 JS 和 PHP 但不适用于 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54305864/

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