Javascript RegExp可以在JS和PHP中工作,但不能在Java中工作

Javascript RegExp可以在JS和PHP中工作,但不能在Java中工作,javascript,java,php,regex,Javascript,Java,Php,Regex,我有一个regexp从HTML源代码中提取id和标签。可以找到它 正如您所看到的,它工作得很好,速度也很快,但是当我使用相同的源代码在java中尝试这个regexp时,它是1。永远和2。仅匹配一个字符串(从第一个a到最后一个a是一个匹配) 我用多行标志打开和关闭进行了尝试,但没有区别。我不明白除了java之外,regexp如何在任何地方都能工作。有什么想法吗 private static final String COURSE_REGEX = "<a class=\"list-group-

我有一个regexp从HTML源代码中提取id和标签。可以找到它

正如您所看到的,它工作得很好,速度也很快,但是当我使用相同的源代码在java中尝试这个regexp时,它是1。永远和2。仅匹配一个字符串(从第一个
a
到最后一个
a
是一个匹配)

我用
多行
标志打开和关闭进行了尝试,但没有区别。我不明白除了java之外,regexp如何在任何地方都能工作。有什么想法吗

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) + ")");
}

private static final String COURSE\u REGEX=“您的正则表达式正在运行,因为子表达式
(?:.*\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>"
“(?s))*
以确保您不会进入下一个
标记。这是使用正则表达式解析HTML的危险之一:)


最后,请向贵校信息学院的一位工作人员致意:)

!(提示:这是邪恶的,如链接的答案所示)非常感谢。虽然我将遵循Tobias给我的使用解析器的建议,但regexp现在可以工作了。我将阅读有关回溯的文章,以便更好地理解regexp。我希望这将在将来防止此类错误:)。我的大学和同一个学院的人回答了我的问题,这是多么巧合啊。让我开心^^