【问题标题】:Split string into repeated characters将字符串拆分为重复的字符
【发布时间】:2014-06-24 18:32:33
【问题描述】:

我想将字符串“aaaabbbccccaaddddcfggghhhh”拆分为“aaaa”、“bbb”、“cccc”。 “aa”、“dddd”、“c”、“f”等。

我试过了:

String[] arr = "aaaabbbccccaaddddcfggghhhh".split("(.)(?!\\1)");

但这会吃掉一个字符,所以使用上面的正则表达式我得到“aaa”,而我希望它是“aaaa”作为第一个字符串。

我如何做到这一点?

【问题讨论】:

标签: java regex string split


【解决方案1】:

在回顾中捕捉怎么样?

(?<=(.))(?!\1|$)

作为 Java 字符串:

(?<=(.))(?!\\1|$)

【讨论】:

  • @T.J.Crowder seems ok here。为什么你认为它不起作用?
  • @Reimeus:因为我没有进行转义就复制粘贴了它。我真的希望Java 有正则表达式文字。 :-)
【解决方案2】:

试试这个:

String   str = "aaaabbbccccaaddddcfggghhhh";
String[] out = str.split("(?<=(.))(?!\\1)");

System.out.println(Arrays.toString(out));
=> [aaaa, bbb, cccc, aa, dddd, c, f, ggg, hhhh]

解释:我们想将字符串拆分为相同字符的组,因此我们需要找出每个组之间的“边界”。我使用 Java 的语法进行正向回溯以选择前一个字符,然后使用反向引用进行负向预读,以验证下一个字符与前一个字符不同。实际上没有消耗任何字符,因为只使用了两个环视断言(即,正则表达式是零宽度)。

【讨论】:

  • 您的解决方案完美运行。你能解释一下这个正则表达式吗?它是如何工作的。
【解决方案3】:

这里我取每个字符并检查 if 循环中的两个条件,即字符串不能超过长度,如果下一个字符不等于第一个字符,则继续 for 循环,否则换行并打印.

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

【讨论】:

  • 对于一个高质量的答案,@Shiva 你能否在你的答案中添加一些解释,说明代码如何实现作者试图实现的目标?
  • 我改进了 answer@pczeus
猜你喜欢
  • 1970-01-01
  • 2013-08-19
  • 1970-01-01
  • 2016-01-16
  • 2012-03-31
  • 2016-12-01
  • 1970-01-01
  • 2017-04-15
  • 2015-01-23
相关资源
最近更新 更多