Elasticsearch の Pattern Capture Token Filter で欲しくなったので書いた。
TL;DR
/([a-z]+)|([A-Z][a-z]+)|([A-Z]+)(?=[A-Z])/g
(A-z の範囲外を扱う場合は [A-Z], [a-z] の代わりに \p{Lu} (対応する小文字がある大文字)、 \p{Ll} (対応する大文字がある小文字)を使うほうが適切なケースもある)
解説
/
([a-z]+) # 小文字の連続 (my)
| ([A-Z][a-z]+) # 大文字に続く小文字の連続 (Case)
| ([[A-Z]+) # 大文字に続く大文字の連続 (CAMEL)
(?=[A-Z]) # 最後の連続する大文字はマッチせず、また消費しない(先読み)
/g
-
/([a-z]+)|([A-Z][a-z]+)|[A-Z]+/gだと、"MyAPIDocs"からは"My","APID","ocs"のような結果が得られてしまう(Docs の D まで食われてしまう) - そこで、大文字の連続のキャプチャグループ
([[A-Z]+)の後ろに[A-Z]をひとつだけ置いておくことで最後の大文字(上の例ならば Docs の D)にマッチさせず、またそれを肯定先読み (positive lookahead)(?=)にしておくことで、消費もさせない