基于Java中除了单点的双点分割

Mah*_*ana 3 java regex string split

我有一个用Java编写的String str1,我想分开.

String str1 = "S1..R1..M1..D2..N3..S1.R1.M1.D2.N3.S1R1M1D2N3";
Run Code Online (Sandbox Code Playgroud)

我想将字符串拆分为数组中的以下元素:

S1.., R1.., M1.., D2.., N3.., S1., R1., M1., D2, N3., S1, R1, M1, D2, N3
Run Code Online (Sandbox Code Playgroud)

我想我必须先进行3次传球分裂,首先是......,然后是.最后还带着信.

首先我试着用..分裂,但我得不到预期的结果:

System.out.println("\n Original String = "+str1+"\nSplit Based on .. = "+Arrays.toString(str1.split("(?<=[..])")));
Run Code Online (Sandbox Code Playgroud)

上述拆分的结果是:

Original String = S1..R1..M1..D2..N3..S1.R1.M1.D2.N3.S1R1M1D2N3
Split Based on .. = [S1., ., R1., ., M1., ., D2., ., N3., ., S1., R1., M1., D2., N3., S1R1M1D2N3]
Run Code Online (Sandbox Code Playgroud)

我甚至试过:

("(?<=[.+])").
Run Code Online (Sandbox Code Playgroud)

不确定我是否需要去模式/匹配.

需要你的帮助.

hwn*_*wnd 5

而不是使用的正回顾后,使用正向前查找.

String s = "S1..R1..M1..D2..N3..S1.R1.M1.D2.N3.S1R1M1D2N3";
String[] parts = s.split("(?<!\\A)(?=[A-Z]\\d)");
System.out.println("Original = " + s + "\nSplitted = " + Arrays.toString(parts));
Run Code Online (Sandbox Code Playgroud)

注意:在前瞻断言之前我使用了Negative Lookbehind断言它不可能匹配字符串开头的位置.通过这样做,它可以防止空元素作为列表中的第一项.

产量

Original = S1..R1..M1..D2..N3..S1.R1.M1.D2.N3.S1R1M1D2N3
Splitted = [S1.., R1.., M1.., D2.., N3.., S1., R1., M1., D2., N3., S1, R1, M1, D2, N3]
Run Code Online (Sandbox Code Playgroud)

另一种方法是匹配而不是拆分.

String s  = "S1..R1..M1..D2..N3..S1.R1.M1.D2.N3.S1R1M1D2N3";
Pattern p = Pattern.compile("[A-Z]\\d+\\.*"); 
Matcher m = p.matcher(s);

List<String> matches = new ArrayList<String>();
while (m.find()) {
   matches.add(m.group());
}

System.out.println(matches);
Run Code Online (Sandbox Code Playgroud)

产量

[S1.., R1.., M1.., D2.., N3.., S1., R1., M1., D2., N3., S1, R1, M1, D2, N3]
Run Code Online (Sandbox Code Playgroud)