Так как в шаблоне в комментариях (?i)((?<=(^?dogs? |^?\s?cats? ))(.*?)(?=(dogs?|cats?)))
вы используете положительный взгляд сзади и положительный взгляд вперед, чтобы совпасть с кошкой или собакой, и из этого вам нужно получить только слова длиной более 4 символов, вы можете использовать \G
который подтверждает конец предыдущего совпадения.
Например:
(?:\b(?:dog|cat)s?|\G)\s+(?:((?!(?:dog|cat)s?\b)\w{3,})|\S+)(?=.*?\s+(?:dog|cat)s?\b)
В Java:
String regex = "(?:\\b(?:dog|cat)s?|\\G)\\s+(?:((?!(?:dog|cat)s?\\b)\\w{3,})|\\S+)(?=.*?\\s+(?:dog|cat)s?\\b)";
См. демонстрационную версию regex | Демонстрация Java
Объяснение
(?:
Группа без захвата \b(?:dog|cat)s?
Граница слова, соответствует либособака или кошка с дополнительным s |
или \G
Утверждение позиции в конце предыдущего матча
)
Закрыть группу без захвата \s+
Совпадение с 1 + пробелами (?:
Группа без захвата (
Группа захвата (?!(?:dog|cat)s?\b)\w{3,}
Отрицательный взгляд, чтобы проверить то, что следует, не собака или кошка с дополнительными s.Если это так, то сопоставьте 3+ раза слово char
)
Закрыть группу захвата |
или \S+
Совпадение 1+ непробельных символов, поскольку мы не можем сопоставить \w{3,}
)
Закрыть группу без захвата (?=.*?\s+(?:dog|cat)s?\b)
Позитивный взгляд вперед, чтобы утверждать, что происходитправо - собака или кошка с дополнительным s