【问题标题】:Split a string by equal characters [closed]用相等的字符分割字符串[关闭]
【发布时间】:2018-11-10 13:33:49
【问题描述】:

如何将一个字符串拆分为多个子字符串,其中每个子字符串包含相等的尾随字符?如:

hello -> h, e, ll, o
helel -> h, e, l, e, l

【问题讨论】:

  • hello变成h e ll o的逻辑是什么?
  • >每个子字符串包含相等的尾随字符,期待一个很酷的 java 流对此的回答
  • 如果有多个相同值的字符彼此尾随(在字符串中彼此相邻),则它们将成为一个新字符串。因此,为什么在第二个示例中两个 'L' 成为两个单独的子字符串
  • 不是最优雅的方式,但您可以使用像(?:(.)(\1))|. 这样的正则表达式。 Demo
  • @Thefourthbird Java 环视中是否允许捕获组?我似乎无法让它工作。也许你应该发布一个答案。

标签: java string split substring character


【解决方案1】:

我在这里想不出一个单一的正则表达式单行,但如果您愿意接受两步解决方案,那么我们可以进行正则表达式替换,然后在空间上拆分:

String input = "hello";
input = input.replaceAll("(\\w)(?!\\1)", "$1 ");
System.out.println(Arrays.toString(input.split(" ")));
input = "helel";
input = input.replaceAll("(\\w)(?!\\1)", "$1 ");
System.out.println(Arrays.toString(input.split(" ")));

[h, e, ll, o]
[h, e, l, e, l]

Demo

这里的诀窍是我们在每个字符前面添加一个空格分隔符,not 紧跟相同的字符。所以hello 中的ll 保持相邻,因为在这种情况下前瞻断言会失败。

【讨论】:

    【解决方案2】:

    你可以像这样使用模式和匹配器:

    String text = "hello";
    String regex = "(.)\\1*";
    Matcher matcher = Pattern.compile(regex).matcher(text);
    
    List<String> result = new ArrayList<>();
    while (matcher.find()) {
        result.add(matcher.group());
    }
    System.out.println(result);
    

    如果您使用的是 Java 9+,则可以使用:

    String text = "hello";
    String regex = "(.)\\1*";
    List<String> result = Pattern.compile(regex).matcher(text).results()
            .map(MatchResult::group)
            .collect(Collectors.toList());
    

    输出

    [h, e, ll, o]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-12
      • 1970-01-01
      • 2014-08-08
      • 1970-01-01
      • 2012-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多