Dawno nie pisałem w Javie z użyciem regexp, ale wydaje mi się, że chyba nie ma tam czegoś na wzór flagi global w JS itp., a gdybyś spróbował zrobić:
while (matcher.find()) {
System.out.println(matcher.group());
}
i można by tego regexp zamienić na coś w stylu:
([a-z]+)(?=-|$)
czyli aby wyszukał [a-z], po którym jest znak myślnika, ale tego myślnika niech nie zapisuje.w grupie (chyba, że jego również chcesz). Wtedy nie trzeba będzie obrabiać stringów i usuwać myślników. Nie pamiętam tylko czy taki zapis w Javie jest oki (częściej pracuję z regexp w JS).
Metoda matcher.groupCount() wydaje mi się, że zlicza liczbę dopasowanych grup w danej iteracji, czyli dla każdego wywołania matcher.find zwróci jedną grupę.