JavaでCamelCaseを分割する

CamelCaseを分割する必要が出てきたのでググってみたけど、大文字続きを一つの単語として認識するものが見つからなかったので書いた。

キャメルケースを単語に分割する - うなの日記 を参考。ここの正規表現

String[] strs = str.split( "(?<=[a-z])(?=[A-Z])" );

だと、「JavaDBOption」が [Java, DBOption] に分割される。これを [Java, DB, Option] にしたいので、正規表現を書き加える。

String[] strs = str.split("(?<=[A-Z])(?=[A-Z][a-z])|(?<=[a-z])(?=[A-Z])");

キャメルケースを単語に分割する - うなの日記 の説明によると、「(?<=[a-z])」が小文字の後、「(?=[A-Z])」が大文字の前に一致する。そこで、大文字の前である「(?<=[A-Z]+)」と直後に小文字が来る大文字の前「(?=[A-Z][a-z])」も区切りとしてやれば、先ほどの [Java, DBOption] の「DBOption」が [DB, Option] のように分割されるというわけだ。

とりあえず適当なCamelCaseを食わせてみた。

String str = "JavaDBOptionMAINGoogleProjectSTRING";
String[] strs = str.split("(?<=[A-Z])(?=[A-Z][a-z])|(?<=[a-z])(?=[A-Z])");
for (String s : strs) {
    System.out.println(s);
}

実行結果。

Java
DB
Option
MAIN
Google
Project
STRING


一応、自分が期待する結果になった。完璧だと断言する自信はない。