Вы, вероятно, хотите экранировать ключевое слово на всякий случай:
Pattern p = text.replaceAll("(?i)(" + Pattern.quote(keyword) + ")(?!([^<]+)?>>)", "<b>$1</b>");
Затем вам нужно создать сопоставление
Matcher m = p.matcher(myInputString);
Если ввод не совпадает, то вы 'сделано:
if (!m.find()) { return myInputString; }
В противном случае выделите выходной буфер:
StringBuilder out = new StringBuilder(myInputString.length() + 16);
и отметьте все вхождения ключевого слова жирным шрифтом:
int nCharsProcessed = 0;
do {
out.append(myInputString, nCharsProcessed, m.start(1))
.append("<b>")
.append(m.group(1))
.append("</b>");
nCharsProcessed = m.end(1);
} while (m.find());
и, наконец, объединитечасть после последнего матча и возврата
out.append(myInputString, nCharsProcessed, myInputString.length());
return out.toString();