Javaで文字列を分割する場合は、「java.lang.String」クラスの「split」メソッドを使用することが多いと思います。
ただし、連続した空白文字列を分割する場合は、期待した結果と違う動作になることがあります。この動作について発生する問題内容と解決方法を紹介していきます。
環境
検証に使用した実行環境を以下に記載します。
- Java 9
問題内容について
例えば、「a□□b□c」という空白文字が連続している文字列を空白文字で分割してみると、「a」、「」、「b」、「c」の4つに分割される結果になります。 「a」、「b」、「c」の3つに分割されることを期待していた場合は、期待結果と異なるという問題が発生します。
実際に以下に記載するテストプログラムを使用して確認してみます。
public static void main(String[] args) { System.out.println("[a b c] > " + Arrays.toString("a b c".split(" "))); // [a b c] > [a, , b, c] }
※例に記載している「□」は、半角スペースを表現しています。
解決方法について
正規表現を使用することで空白文字が連続している文字列を分割することができます。「java.lang.String」クラスの「split」の引数に以下のいずれかの正規表現を使用します。
- [ ]+:半角スペースのみを区切り文字の対象とします。
- [\\s]+:半角スペース、タブ、改行を区切り文字の対象とします。
最後の「+」は必ず指定するようにしてください。「+」を使用することで連続していた文字列を1つの分割対象として判断することができるようになります。
実際に以下に記載するテストプログラムを使用して確認してみます。
public static void main(String[] args) { // 半角スペースのみを分割対象にします。 System.out.println("[a b c] > " + Arrays.toString("a b c".split("[ ]+"))); // [a b c] > [a, b, c] // 半角スペース、タブ、改行文字を分割対象にします。 System.out.println("[a b c\td\ne] > " + Arrays.toString("a b c\td\ne".split("[\s]+"))); // [a b c\td\ne] > [a, b, c, d, e] // 「\t」はタブ文字、「\n」は改行コードになります。 }
まとめ
文字列を分割する場合は、連続する文字が使用されることを考慮して正規表現などを使用することも検討するようにすることで、文字列を意図したように分割することができるようになります。