【问题标题】:Java - Split and trim in one shotJava - 一次分割和修剪
【发布时间】:2017-06-16 15:24:47
【问题描述】:

我有一个这样的字符串:String attributes = " foo boo, faa baa, fii bii," 我想得到这样的结果:

String[] result = {"foo boo", "faa baa", "fii bii"};

所以我的问题是如何在我已经拆分的一个镜头中进行拆分和修剪:

String[] result = attributes.split(",");

spaces 仍在结果中:

String[] result = {" foo boo", " faa baa", " fii bii"};
                    ^           ^           ^

我知道我们可以制作一个循环并为每个人制作trim,但我想在镜头中制作它。

【问题讨论】:

  • 您也可以在,\\s 上拆分并删除String 中的最后一个,
  • @KevinEsche 请注意第一个条目中的前导空格。这也必须修剪。
  • 在我看来,在“两枪”中执行此操作将是最简洁的编码方式,并且不会花费太多精力。我真的不认为把这个复杂化有什么意义。
  • 我第二个银爪。恕我直言,这是过早的优化。这么长时间分两步做不会导致性能问题,分两步做。不值得努力,我猜。

标签: java string split


【解决方案1】:

用逗号和空格分割怎么样:

String result[] = attributes.split(",\\s");

【讨论】:

  • 这仍然需要对第一个和最后一个条目进行特殊处理。不是问题,只是说。所以它也不是真正的“一次性”。
  • 这会在开始和结束时返回类似这个空格的结果` foo boo faa baa fii bii,`
  • @YCF_L 不过,这会降低您修剪 result[0] 并从 result[result.length-1] 中删除“,”而不是触摸每个元素的努力。
【解决方案2】:

使用正则表达式\s*,\s*进行拆分。

String result[] = attributes.split("\\s*,\\s*");

用于初始和尾随空格
以前的解决方案仍然留下初始和尾随空格。因此,如果我们期望它们中的任何一个,那么我们可以使用以下解决方案来删除它们:

String result[] = attributes.trim().split("\\s*,\\s*");

【讨论】:

  • 还是不属于单发!!!! @YCF_L as trim 是他的第一枪,split 是第二枪!!!
  • @SASIKUMAR 如果没有 trim(),它永远无法工作。因为 split 只是分割字符串而不改变分割。
  • @SASIKUMARS 我认为这是迄今为止更好的解决方案,也许我们可以等待一个更好的解决方案?
  • 好吧,我想这已经尽可能接近了,无需编写自己的解析器。而且它只有 1 个修剪而不是 n 个修剪...
  • @RodrigoR.Coelho \\s 本身将覆盖所有空格字符。所以在你的情况下,你可以使用attributes.trim().split("\\s*");
【解决方案3】:

使用 java 8 你可以在一行中做到这一点

String[] result = Arrays.stream(attributes.split(",")).map(String::trim).toArray(String[]::new);

【讨论】:

  • 这不是一枪!我猜你只是在一行中写 for 循环
  • @SASIKUMARS 取决于您对“一次拍摄”的定义。如果等于“一行”就完全没问题了。
  • @SASIKUMARS 我不同意。我也是,我将其解释为“在一个步骤中”,但这并不意味着其他解释无效。
  • 我不是说它无效。它不是最好的解决方案......但即使它是一个很好的解决方案!!! @Fildor
  • @MikhailBatcer String[]::newpart 基本上是一个函数,它产生所需类型和提供长度的新数组。并且方法本身toArray()通过使用上面指定的函数返回一个包含流元素的数组。
【解决方案4】:

如果逗号之间没有文本,则以下表达式不会创建空元素:

String result[] = attributes.trim().split("\\s*,+\\s*,*\\s*");

【讨论】:

  • 不错的尝试。 ⠀⠀⠀
【解决方案5】:
String result[] = attributes.trim().split("\\s*,[,\\s]*");

以前在这里发布过:https://blog.oio.de/2012/08/23/split-comma-separated-strings-in-java/

【讨论】:

    【解决方案6】:

    创建您自己的自定义函数

    private static String[] split_and_trim_in_one_shot(String string){
     String[] result  = string.split(",");
     int array_length = result.length;
    
     for(int i =0; i < array_length ; i++){
      result[i]=result[i].trim();
     }
     return result;
    

    考虑自定义分隔符的重载

    private static String[] split_and_trim_in_one_shot(String string, String delimiter){
     String[] result  = string.split(delimiter);
     int array_length = result.length;
    
     for(int i =0; i < array_length ; i++){
      result[i]=result[i].trim();
     }
     return result;
    

    【讨论】:

      【解决方案7】:
      // given input
      String attributes = " foo boo, faa baa, fii bii,";
      
      // desired output
      String[] result = {"foo boo", "faa baa", "fii bii"};
      

      这应该可行:

      String[] s = attributes.trim().split("[,]");
      

      @Raman Sahasi 回答:

      在拆分字符串之前,您可以修剪尾随和前导空格。我使用了分隔符 ,,因为它是您字符串中唯一的分隔符

      【讨论】:

      • 不!它保留了 faa 和 fii 的前导空格!!!
      • 带有 grovy 和尾随星号运算符将对每个元素应用任何尾随操作: attributes.split("[,]")*.trim() (希望仍然可读在 cmets 中使用迷你格式代码)
      【解决方案8】:

      最好的办法是:

      value.split(",").map(function(x) {return x.trim()});
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-27
        • 2023-02-02
        • 2021-07-16
        • 2019-01-31
        • 2014-04-10
        • 1970-01-01
        • 1970-01-01
        • 2018-02-06
        相关资源
        最近更新 更多