Попробуйте это:
Pattern p = Pattern.compile("\\b([A-Z]?[a-z]*[sS])\\b");
Matcher m = p.matcher("Denis goeS to school every day!");
while(m.find())
{
System.out.println( m.group(1) );
}
Регулярное выражение соответствует каждому слову, начинающемуся с чего угодно, кроме пробела или 2 символов верхнего регистра, содержит только символы нижнего регистра в середине и оканчивается на s или S.
В вашем примере это будет соответствовать Denis
и goeS
. Если вы хотите соответствовать только верхнему регистру S, измените выражение на "\\b([A-Z]?[a-z]*[S])\\b"
, которое будет соответствовать goeS
и GoeS
, но не GOeS
, gOeS
или goES
.