Pattern p = Pattern.compile("(?s)<!--(?:(?!-->).)*<!DOCTYPE");
(?:(?!-->).)*
соответствует одному символу за раз, после , проверяя, что это не первый символ -->
.
(?s)
устанавливает режим DOTALL (так называемый одиночныйрежим строки), позволяя .
сопоставлять символы новой строки.
Если существует возможность двух или более совпадений, и вы хотите найти их по отдельности, вы можете заменить *
на не жадный*?
, вот так:
"(?s)<!--(?:(?!-->).)*?<!DOCTYPE"
Например, применение этого регулярного выражения к тексту вашего вопроса найдет два совпадения, в то время как исходное регулярное выражение найдет одно, более длинное совпадение.