Ну, вы только когда-либо просили это ... В вашем исходном коде находка смещает совпадение от одного совпадения всего регулярного выражения к следующему, в то время как внутри тела while вы когда-нибудь вытащить одну группу. На самом деле, если бы в вашей строке было несколько совпадений регулярного выражения, вы бы обнаружили, что в первом случае вы получили бы «part1», во втором случае вы бы получили «part2», и для любая другая ссылка, которую вы получили бы ошибку.
while(matcher.find()) {
System.out.print("Part 1: ");
System.out.println(matcher.group(1));
System.out.print("Part 2: ");
System.out.println(matcher.group(2));
System.out.print("Entire match: ");
System.out.println(matcher.group(0));
}