По первому вопросу сделайте его ленивым.Вы можете поставить вопросительный знак после квантификатора, и тогда квантификатор будет соответствовать как можно меньшему количеству.
(?<=an).*?(?=for)
Я понятия не имею, для чего дополнительный .
в конце хорош в .*.
егоненужный.
Для вашего второго вопроса вы должны определить, что такое «слово».Я бы сказал здесь, вероятно, просто последовательность без пробелов, за которой следуют пробелы.Примерно так:
\S+\s
и повторите это 3 раза вот так:
(?<=an)\s(\S+\s){3}(?=for)
Чтобы убедиться, что в шаблонах для целых слов используются границы слов
(?<=\ban\b)\s(\S+\s){1,5}(?=\bfor\b)
См.он онлайн здесь на Regexr
{3}
будет точно соответствовать 3 для минимума 1 и максимум 3 для этого {1,3}
Альтернатива:
Как правильно указал dma_k в вашем случае, здесь нет необходимости использовать оглядываться назад и заглядывать в будущее.См. здесь документацию Matcher о группах
Вместо этого вы можете использовать группы захвата.Просто поместите часть, которую вы хотите извлечь, в скобки, и она будет помещена в группу захвата.
\ban\b(.*?)\bfor\b
Смотрите это онлайн здесь на Regexr
Вы можете чемполучить доступ к этой группе следующим образом:
System.out.println("I found the text: " + matcher.group(1).toString());
^
У вас есть только одна пара скобок, так что все просто, просто введите 1
в matcher.group(1)
, чтобы получить доступ к первой группе захвата.