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)(?=)
にしておくことで、消費もさせない