【问题标题】:Remove empty Strings after splitting a StringBuilder into Array Java将 StringBuilder 拆分为 Array Java 后删除空字符串
【发布时间】:2019-06-10 08:49:28
【问题描述】:

对不起,如果这个问题已经被问过,但我只能找到 c# 的结果。 所以我有了这个 StringBuilder:

 StringBuilder sb = new StringBuilder(" 111     11 ");

我想用这个方法把它拆分成一个数组:

String[] ar = sb.toString().split(" ");

正如预期的那样,结果数组有一些空条目。我的问题是,我是否可以在拆分 StringBuilder 时直接删除这些空格,或者以后必须这样做。

【问题讨论】:

    标签: java arrays string split


    【解决方案1】:

    如果您不想依赖任何第三方依赖并且不想进行正则表达式过滤,

    您可以使用 Java 8 Streams API 一次性完成:

    Arrays.stream(sb.toString().trim().split(" ")).filter(s-> !s.equals("")).map(s -> s.trim()).toArray();
    

    对于前面的详细多行版本:

    Arrays.stream(sb.toString()
        .trim() // Trim the starting and ending whitespaces from string
        .split(" ")) // Split the regarding to spaces
        .filter(s-> !s.equals("")) // Filter the non-empty elements from the stream
        .map(s -> s.trim()) // Trim the starting and ending whitespaces from element
        .toArray(); // Collect the elements to object array
    

    这是演示的工作代码:

    StringBuilder sb = new StringBuilder(" 111     11 ");
    Object[] array = Arrays.stream(sb.toString().trim().split(" ")).filter(s-> !s.equals("")).map(s -> s.trim()).toArray();
    
    System.out.println("(" + array[0] + ")");
    System.out.println("(" + array[1] + ")");
    

    【讨论】:

      【解决方案2】:

      有几个正则表达式可以处理它,我也更喜欢@rzwitserloot 方法, 但如果你想看更多。

      在这里查看:How do I split a string with any whitespace chars as delimiters?

      glenatron已经解释过了:

      在大多数正则表达式方言中,有一组方便的字符摘要可用于此类事情 - 这些都是值得记住的:

      \w - 匹配任何单词字符。

      \W - 匹配任何非单词字符。

      \s - 匹配任何空白字符。

      \S - 匹配除空白字符以外的任何字符。

      \d - 匹配任何数字。

      \D - 匹配除数字以外的任何内容。

      搜索“Regex Cheatsheets”应该会给您很多有用的摘要。

      感谢glenatron

      【讨论】:

        【解决方案3】:

        您可以使用 Apache Commons 的交钥匙解决方案。 这是一个例子:

        StringBuilder sb = new StringBuilder(" 111     11 ");
        String trimmedString = StringUtils.normalizeSpace(sb.toString());
        String[] trimmedAr = trimmedString.split(" ");
        System.out.println(Arrays.toString(trimmedAr));
        

        输出:[111, 11]

        【讨论】:

          【解决方案4】:

          我会为此使用guava

              String t = " 111     11 ";
              Splitter.on(Pattern.compile("\\s+"))
                      .omitEmptyStrings()
                      .split(t)
                      .forEach(System.out::println);
          

          【讨论】:

          • 我可以使用这种方法将分割后的字符串存储在数组中吗?
          • @PetarYakov 你可以到一个List:Splitter.on(Pattern.compile("\\s+")) .omitEmptyStrings() .splitToList(t); 从这里到一个数组是微不足道的...
          【解决方案5】:

          split 采用正则表达式。所以:

          String[] ar = sb.toString().split("\\s+");
          

          字符串\\s 是“任何空格”的正则表达式,+ 是:1 个或多个。如果您只想拆分空格(而不是换行符、制表符等),请尝试:String[] ar = sb.toString().split(" +");,字面意思是:“拆分一个或多个空格”。

          这个技巧几乎适用于任何分隔符。例如,以逗号分隔?试试:.split("\\s*,\\s*"),即:0 个或多个空格,一个逗号,后跟 0 个或多个空格(正则表达式尽可能多地占用)。

          请注意,此技巧不会消除前导和尾随空格。但要做到这一点,请使用修剪。把它们放在一起:

          String[] ar = sb.toString().trim().split("\\s+");
          

          逗号:

          String[] ar = sb.toString().trim().split("\\s*,\\s*");
          

          【讨论】:

          • 这也是我要建议的,但这是否消除了开头和结尾的空条目?
          • @RobbyCornelissen 不,它没有
          • 使用sb.toString().trim().split("\\s+")
          • @Eugene String.split() 似乎会自动删除尾随的空条目。虽然不是领先的。这一直是一种挑剔的方法。我倾向于选择番石榴分离器。
          • @RobbyCornelissen ha,您用我给出的答案更新了评论。我同意,我喜欢那门课
          猜你喜欢
          • 2013-01-14
          • 1970-01-01
          • 1970-01-01
          • 2016-02-12
          • 2021-07-17
          • 1970-01-01
          相关资源
          最近更新 更多