キャメルケースを単語に分割する
キャメルケースを単語に分割したいときには、「ゼロ幅の肯定先読み」を使うとさくっとできます。
// 分割する文字列 String str = "StringIndexOutOfBoundsException"; // 小文字と大文字の間で分割 String[] strs = str.split( "(?<=[a-z])(?=[A-Z])" ); for ( String s : strs) { System.out.println( s ); }
実行結果です。
String Index Out Of Bounds Exception
動作としては、
- 「(?<=[a-z])」が「ゼロ幅の肯定後読み」で、「小文字の後」にマッチ(小文字自体にはマッチしない)。
- 「(?=[A-Z])」が「ゼロ幅の肯定先読み」で、「大文字の前」にマッチ(大文字自体にはマッチしない)。
- なので、「(?<=[a-z])(?=[A-Z])」は、「小文字と大文字の間」にマッチし、期待通り分割される。
と理解したのだけど、あってるのかな?んー、正直、あんまし自信はない。