Java 基于正则表达式拆分数组

Java 基于正则表达式拆分数组,java,arrays,regex,split,Java,Arrays,Regex,Split,很抱歉,如果这是一个愚蠢的问题,因为我是Java新手 如果我有一个数组 { "A123","blue","A456","red","green", "B111","purple","C444","blue","green","yellow","pink"

很抱歉,如果这是一个愚蠢的问题,因为我是Java新手

如果我有一个数组

{ "A123","blue","A456","red","green",
  "B111","purple","C444","blue","green","yellow","pink" }
如何将其拆分为更小的数组,其中第一个元素应该是一个字母,后跟3个数字?例如,输出将是:

{ {"A123","blue"},{"A456","red","green"},
  {"B111","purple"},{"C444","blue","green","yellow","pink"} }
模式
[A-Z][0-9]{3}
之后可以有任意数量的元素,直到模式下一次出现为止。

下面是一个示例:

@测试
公共无效测试{
字符串[]字符串=新字符串[]{
“A123”、“蓝色”、“A456”、“红色”、“绿色”,
“B111”、“紫色”、“C444”、“蓝色”、“绿色”、“黄色”、“粉色”
};
列表输出=新的ArrayList();
List currentList=null;
用于(字符串s:字符串){
如果(s.matches(“[A-Z][0-9]{3}”)){
//启动新的子列表
currentList=新的ArrayList();
output.add(当前列表);
}
currentList.add(s);
}
系统输出打印项次(输出);
}
它产生:

[[A123, blue], [A456, red, green], [B111, purple], [C444, blue, green, yellow, pink]]

您可以从此阵列收集地图:

String[]arr={“A123”、“蓝色”、“A456”、“红色”、“绿色”,
“B111”、“紫色”、“C444”、“蓝色”、“绿色”、“黄色”、“粉色”};
Map Map=newlinkedhashmap();
//假设第一个是“主要”元素
List=null;
用于(字符串str:arr){
//如果这是一个“主要”元素
//正则表达式:
//\\D{1}-第一个字符是非数字
//\\d+-非空数字序列
if(str.matches(“\\D{1}\\D+”){
//将新条目放入地图并初始化新列表
list=map.computeIfAbsent(str,el->newArrayList());
}否则{
//否则,将“次要”元素添加到列表中
添加(str);
}
}
//输出
map.forEach((k,v)->System.out.println(k+“=”+v));
//A123=[蓝色]
//A456=[红色,绿色]
//B111=[紫色]
//C444=[蓝色、绿色、黄色、粉色]

//如果需要,将贴图转换为二维数组
字符串[][]arr2d=map.entrySet().stream()
.map(条目->流)
.concat(Stream.of(entry.getKey()),entry.getValue().Stream())
.toArray(字符串[]::新建))
.toArray(字符串[]:[]::新建);
//输出
Arrays.stream(arr2d).map(Arrays::toString).forEach(System.out::println);
//[A123,蓝色]
//[A456,红色,绿色]
//[B111,紫色]
//[C444,蓝色,绿色,黄色,粉色]