##文字列を区切り文字を含む形でスマートに分割したい
java7ではString#split()で文字列を分割したとき、1番目の要素に空文字ができてしまうことがあります。
そこで以下のコードを実行したとき、str2とstr3の先頭要素に空要素ができないような分割を行いたいです。
正規表現に関しては知識がないので自力で考えられる解決策としては、分割した配列の1番目の要素が空文字なら横に詰める方法です。
しかし、正規表現だけで解決できるのであればご教授いただければと思います。
java8ではString#split()のその点が改善されているようですがjava7でお願いします。
java7
1import java.util.Arrays; 2 3public class Test1 { 4 5 public static void main(String[] args) { 6 7 String regex = "(?=◆)"; 8 9 String str1 = "◆ABCD123"; 10 String str2 = "◆ABCD123◆ABCD123"; 11 String str3 = "◆ABCD123◆ABCD123◆"; 12 String str4 = "ABCD123"; 13 String str5 = ""; 14 String str6 = "ABCD123◆ABCD123"; 15 16 String[] ary1 = str1.split(regex); 17 String[] ary2 = str2.split(regex); 18 String[] ary3 = str3.split(regex); 19 String[] ary4 = str4.split(regex); 20 String[] ary5 = str5.split(regex); 21 String[] ary6 = str6.split(regex); 22 23 System.out.println(Arrays.toString(ary1)); 24 System.out.println(Arrays.toString(ary2)); 25 System.out.println(Arrays.toString(ary3)); 26 System.out.println(Arrays.toString(ary4)); 27 System.out.println(Arrays.toString(ary5)); 28 System.out.println(Arrays.toString(ary6)); 29 } 30} 31
実行結果
【実際の結果】
[◆ABCD123] [, ◆ABCD123, ◆ABCD123] [, ◆ABCD123, ◆ABCD123, ◆] [ABCD123] [] [ABCD123, ◆ABCD123]
【理想とする結果】
[◆ABCD123] [◆ABCD123, ◆ABCD123] [◆ABCD123, ◆ABCD123, ◆] [ABCD123] [] [ABCD123, ◆ABCD123]
上記で書いた横に詰める解決案
java
1import java.util.ArrayList; 2import java.util.Arrays; 3import java.util.List; 4 5public class Test2 { 6 7 public static void main(String[] args) { 8 9 String regex = "(?=◆)"; 10 11 String str1 = "◆ABCD123"; 12 String str2 = "◆ABCD123◆ABCD123"; 13 String str3 = "◆ABCD123◆ABCD123◆"; 14 String str4 = "ABCD123"; 15 String str5 = ""; 16 String str6 = "ABCD123◆ABCD123"; 17 18 String[] ary1 = split(str1, regex); 19 String[] ary2 = split(str2, regex); 20 String[] ary3 = split(str3, regex); 21 String[] ary4 = split(str4, regex); 22 String[] ary5 = split(str5, regex); 23 String[] ary6 = split(str6, regex); 24 25 System.out.println(Arrays.toString(ary1)); 26 System.out.println(Arrays.toString(ary2)); 27 System.out.println(Arrays.toString(ary3)); 28 System.out.println(Arrays.toString(ary4)); 29 System.out.println(Arrays.toString(ary5)); 30 System.out.println(Arrays.toString(ary6)); 31 } 32 33 private static String[] split(String str, String regex) { 34 String[] ary = str.split(regex); 35 36 if (ary.length >= 2 && ary[0].equals("")) { 37 List<String> tmp = new ArrayList<>(Arrays.asList(ary)); 38 tmp.remove(0); 39 ary = tmp.toArray(new String[0]); 40 } 41 42 return ary; 43 } 44}
追記
java8ではString#split()のその点が改善されているようですがjava7でお願いします。
この点に関して実際に試してみました。
【実行コード】
java
1import java.util.Arrays; 2 3public class Test { 4 5 public static void main(String[] args) { 6 7 String regex = "(?=◆)"; 8 9 String str1 = "◆ABCD123"; 10 String str2 = "◆ABCD123◆ABCD123"; 11 String str3 = "◆ABCD123◆ABCD123◆"; 12 String str4 = "ABCD123"; 13 String str5 = ""; 14 String str6 = "ABCD123◆ABCD123"; 15 16 String[] ary1 = str1.split(regex); 17 String[] ary2 = str2.split(regex); 18 String[] ary3 = str3.split(regex); 19 String[] ary4 = str4.split(regex); 20 String[] ary5 = str5.split(regex); 21 String[] ary6 = str6.split(regex); 22 23 // Javaのバージョンを出力 24 System.out.println("java.version : " + System.getProperty("java.version")); 25 System.out.println("java.vm.version : " + System.getProperty("java.vm.version")); 26 System.out.println(); 27 28 System.out.println(Arrays.toString(ary1)); 29 System.out.println(Arrays.toString(ary2)); 30 System.out.println(Arrays.toString(ary3)); 31 System.out.println(Arrays.toString(ary4)); 32 System.out.println(Arrays.toString(ary5)); 33 System.out.println(Arrays.toString(ary6)); 34 } 35}
実行結果
【Java7】
java.version : 1.7.0_80 java.vm.version : 24.80-b11 [◆ABCD123] [, ◆ABCD123, ◆ABCD123] [, ◆ABCD123, ◆ABCD123, ◆] [ABCD123] [] [ABCD123, ◆ABCD123]
【Java8】
java.version : 1.8.0_71 java.vm.version : 25.71-b15 [◆ABCD123] [◆ABCD123, ◆ABCD123] [◆ABCD123, ◆ABCD123, ◆] [ABCD123] [] [ABCD123, ◆ABCD123]
回答1件
あなたの回答
tips
プレビュー