Не уверен, что регулярное выражение является лучшим вариантом здесь, так как у вас есть смесь фиксированных слов и произвольных правил, но я думаю, что с небольшим упреждением:
(OAuth2|OpenID|[A-Z]+$|[A-Z]+(?=[A-Z][^A-Z])|[A-Z][^A-Z]+)
, который принимает OAuth2 и OpenID в качестве особых случаев - иначе любая последовательность из 2 или более заглавных букв и одной заглавной буквы, за которой следуют не заглавные буквы. Разница заключается в том, что это позволяет отыскать нужные вам части в группе (группа 1), и вы можете проходить матчи.
Если вы просто хотите преобразовать текст, вы можете использовать это:
uri.replace(/(OAuth2|OpenID|[A-Z]+$|[A-Z]+(?=[A-Z][^A-Z])|[A-Z][^A-Z]+)/, function(v) { return "-"+v.toLowerCase(); });
uri = uri.substring(1);