Ваше регулярное выражение сталкивается с катастрофическим возвратом из-за огромного числа возможных перестановок, которые необходимо проверить подвыражению (?:.*\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
, который изменяет поведение якорей ^
и $
(ни один из которых ваше регулярное выражение использует).
Также обратите внимание, что вам не нужно экранировать косую черту в регулярном выражении Java.
Это решение не очень надежно, потому что .*?
довольно неопределенно. Я полагаю, ваша предыдущая попытка (?:.*\\s){7}
могла быть рассчитана не более чем на 7 строк текста? В этом случае вы можете использовать (?:(?!</a>).)*
, чтобы не переходить к следующему тегу <a>
. Это одна из опасностей парсинга HTML с помощью регулярных выражений:)
Наконец, привет от сотрудника факультета информатики в вашем университете:)