lookingAt()
применяет регулярное выражение, как если бы оно было привязано в начале с \A
, поэтому единственное совпадение, которое вы когда-либо получите, - это то, которое начинается в самом начале объекта.Если тема не начинается с <
или &
, единственным регулярным выражением в этом списке, который когда-либо будет соответствовать, является последний, .*
.И, так как вы делаете совпадение в режиме DOTALL, .*
всегда будет соответствовать всему предмету.
Похоже, вы намеревались обновить позицию начала матча после каждого матча, и я вижу вас сохраняем новую позицию, но вы ничего с этим не делаете.Вам нужно использовать его в методе region(int, int)
, чтобы изменить то, что Matcher считает началом предмета, например:
position = matcher.end();
matcher.region(position, matcher.regionEnd());
Но вы все равно получите намного больше, чем выхотите с каждым совпадением из-за .*
в большинстве ваших регулярных выражений, все из которых применяются в режиме DOTALL.Вы должны быть гораздо более конкретным, чем это. Как зависит от вашей конечной цели.Если вы пытаетесь написать лексер для полного, промышленного парсера HTML, вам следует отказаться от него прямо сейчас и прочитать, как пишутся real парсеры.
Вот кодовый список Мастеринг регулярных выражений , который похож на то, что вы делаете.Он демонстрирует некоторые важные приемы, такие как сохранение регулярных выражений в виде скомпилированных объектов Pattern и их замена с использованием метода usePattern()
Matcher вместо постоянного создания новых объектов Pattern и Matcher.(Он также добавляет \\G
к каждому регулярному выражению и использует find()
или find(int)
для их применения; эта часть устарела. region()
и lookingAt()
- все, что вам нужно.)