将正则表达式拆分以提取连续字符的字符串

24

有没有一种正则表达式可以与 String.split() 一起使用,将字符串分解为连续的字符 - 即在下一个字符与前一个字符不同的位置进行分解?

以下是测试用例:

String regex = "your answer here";
String[] parts = "aaabbcddeee".split(regex);
System.out.println(Arrays.toString(parts));

预期输出:

[aaa, bb, c, dd, eee]
尽管测试用例只包含字母作为输入,但这仅是为了清晰明了;输入字符可以是 任何 字符。
请不要提供涉及循环或其他技术的“解决方法”。
问题是找到适合上述代码的正确正则表达式 - 即仅使用 split() 而没有其他方法调用。这不是一个寻找能够“完成任务”的代码的问题。
1个回答

32

完全可以写一个正则表达式在一步中进行分割:

"(?<=(.))(?!\\1)"

由于您想在每组相同字符之间进行拆分,因此我们只需要查找两个组之间的分界线。我通过使用正向回顾来获取前一个字符,并使用负向先行断言和反向引用来检查下一个字符是否不是相同的字符来实现这一点。

正如您所看到的,正则表达式是零宽度的(仅有两个环视断言)。没有任何字符被正则表达式消耗。


.net中,组内的字符,即(.)也包含在结果中。我想知道为什么在java中不是这种情况。 - Anirudha
@Some1.Kill.The.DJ:我猜不同的编程语言之间会有一些差异。我不知道如何在.NET中实现相同的效果(或Ruby,因为它也将捕获组包含在split的结果中)。 - nhahtdh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接