我想要将字符串 "aaaabbbccccaaddddcfggghhhh" 分割成 "aaaa", "bbb", "cccc", "aa", "dddd", "c", "f" 等。
我尝试了这个方法:
String[] arr = "aaaabbbccccaaddddcfggghhhh".split("(.)(?!\\1)");
但这会消耗掉一个字符,所以使用上述正则表达式得到的结果是"aaa",然而我希望它是"aaaa",和第一个字符串相同。
我该如何实现这个?
试一下这个:
String str = "aaaabbbccccaaddddcfggghhhh";
String[] out = str.split("(?<=(.))(?!\\1)");
System.out.println(Arrays.toString(out));
=> [aaaa, bbb, cccc, aa, dddd, c, f, ggg, hhhh]
解释:我们想要将字符串按相同字符组分割,因此需要找到每个组之间的“边界”。我使用Java的正后顾语法选择前一个字符,然后使用反向引用的负向前瞻来验证下一个字符与前一个字符不同。没有实际使用任何字符,因为只使用了两个环视断言(也就是说,正则表达式是零宽度的)。
(?<=(.))(?!\1|$)
作为Java字符串:
(?<=(.))(?!\\1|$)
for (int i = 0; i < arr.length; i++) {
char chr= arr[i];
System.out.print(chr);
if (i + 1 < arr.length && arr[i + 1] != chr) {
System.out.print(" \n");
}
}
string.split()
比循环慢吗? - Amal Murali(?<=(.))(?!\\1)
会让我感到困惑。 - Crunchergroup "aaaabbbccccaaddddcfggghhhh"
返回预期结果["aaaa","bbb","cccc","aa","dddd","c","f","ggg","hhhh"]
... - Bakuriu