splitを使います。入力文字列と区切り文字のパターンを次のように用意します。
Java
1String source = "aaa.111,bbb.222,ccc.333";
2String pattern1 = "\.[0-9]{3},?"; // 区切り文字列1
3String pattern2 = ",?[a-z]{3}\."; // 区切り文字列2
やってみるとわかりますが、pattern2を使うと分割した配列の先頭に空文字列が出ます。
仕方がないのでStreamのfilter機能で空文字列を除去します。やりかたは2とおり。
Java
1import java.util.stream.Stream;
2Stream.of(source.split(pattern2))
3 .filter(x -> !x.isEmpty())
4 //.peek(System.out::println)
5 .toArray(size -> new String[size]);
Java
1import java.util.regex.Pattern;
2Pattern.compile(pattern2)
3 .splitAsStream(source)
4 .filter(x -> !x.isEmpty())
5 //.peek(System.out::println)
6 .toArray(size -> new String[size]);
Collectors.partitioningBy (2019-02-27)
Collectorsを使う解を示します。splitを使います。入力文字列と区切り文字のパターンを次のように用意します。
Java
1String source = "aaa.111,bbb.222,ccc.333";
2String pattern = "\.|,"; // 区切り文字列
Pattern.splitAsStream、Collectors.partitioningByを使います。
Java
1import java.util.List;
2import java.util.Map;
3import java.util.regex.Pattern;
4import java.util.stream.Collectors;
5Map<Boolean, List<String>> m =
6 Pattern.compile(pattern)
7 .splitAsStream(source)
8 //.peek(System.out::println)
9 .collect(
10 Collectors.partitioningBy(x -> x.charAt(0) >= 'a')
11 );
12System.out.println(m);
結果は、List<String>ですが、String[]への変換は容易なので省略。
Scalaは簡単にできるので、Java以外の言語ならもっと簡単になるのではないでしょうか。
Scala
1val (a,b) = "[a-z]{3}|[0-9]{3}".r.findAllIn("aaa.111,bbb.222,ccc.333").partition(x => x.charAt(0)>='a')