java - Java中基于双点不包括单点的分割

标签 java regex string split

我下面有一个用 Java 编写的字符串 str1,我想将其拆分。

String str1 = "S1..R1..M1..D2..N3..S1.R1.M1.D2.N3.S1R1M1D2N3";

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

S1.., R1.., M1.., D2.., N3.., S1., R1., M1., D2, N3., S1, R1, M1, D2, N3

我想我必须进行 3 次传递拆分,首先是 ..,然后是 .最后是字母。

首先我尝试用 .. 拆分,但我没有得到预期的结果:

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

上面拆分的结果是:

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]

我什至尝试过:

("(?<=[.+])").

不确定我是否需要进行模式/匹配。

需要您的帮助。

最佳答案

不使用Positive Lookbehind,而是使用Positive Lookahead .

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));

注意:我在先行断言之前使用了 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]

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

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);

输出

[S1.., R1.., M1.., D2.., N3.., S1., R1., M1., D2., N3., S1, R1, M1, D2, N3]

关于java - Java中基于双点不包括单点的分割,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25225781/

相关文章:

Java匹配正则表达式,然后使用第二个正则表达式格式化字符串

java - Java Char 数组有什么用?

ios - 将带空格的字符串拆分为带换行符的字符串并显示在 UILabel 中

Java数组通过类构造函数初始化(性能问题)

java - Xml如何设置UTF-16编码格式?

java - 使用空字符串作为分隔符拆分字符串会产生前导空字符串但不会产生尾随空字符串

ios - 把字符串变成 UIColor swift

Java Web 启动 AMI

java - 单元测试 - 验证 Observable 是否被订阅

javascript - 删除任何空格的基本正则表达式