【问题标题】:How to avoid Blank space insertion at the beginning of the String in Java while using Split() function使用 Split() 函数时如何避免在 Java 中的字符串开头插入空格
【发布时间】:2015-05-18 20:55:38
【问题描述】:

这里是代码片段。

public static void main(String...strings){
        String s="google";
        String[] s1=s.split("");
        System.out.println(s1[0]);
        System.out.println(s1.length);
    }

我正在尝试围绕每个字符拆分 String 。但问题是在拆分数组的开头引入了拆分空格。 这给了我输出长度 7 而不是 6。因为它不能有尾随空格,因为这里的拆分将作为 split("", 0) 传递,所以它必须在开头 为了测试我打印了s1[0],它确实给了空格。

我的问题是如何避免这样的问题。我需要使用拆分。

这里到底发生了什么?

IdeOne Link

【问题讨论】:

  • 在拆分数组的开头引入了一个空格 - 不。不是..我刚试过..
  • 您发布的代码为您提供了数组["g", "o", "o", "g", "l", "e"]。它不会产生您所说的错误。请检查您是否发布了遇到问题的实际代码。
  • 它工作正常..输出为 g 6
  • @TheLostMind 检查上面的 IdeOneLink 以了解拆分数组的长度
  • 它确实产生了他所说的那样。 [, g, o, o, g, l, e] 合法问题。停止发布检查您的代码作为答案。

标签: java regex string split


【解决方案1】:

String.split() 方法在 Java 7(由 IdeOne 使用)和 Java 8(可能由一些评论者和回答者使用)中的行为不同。在String.split() 的 Java 8 JavaDoc 文档中,写了以下内容:

如果在此字符串的开头存在正宽度匹配,则在结果数组的开头包含一个空的前导子字符串。但是,开头的零宽度匹配永远不会产生这样的空前导子字符串。

因此,根据 Java 8,"google".split("") 等于 ["g","o","o","g","l","e"]

Java 7 文档中没有此注释,实际上,在 Java 7 中,"google".split("") 似乎等于 ["", "g","o","o","g","l","e"]

(在 Java 7 和 Java 8 中,数组末尾的空字符串都被删除。)

最好的解决方案似乎是添加代码以忽略第一个字符串(如果它是空的)。 (请注意,当您的输入包含多个单词时,另一个答案中建议的split("\\B") 解决方案会产生意想不到的结果。)

【讨论】:

  • 我正在寻找的解释 .. 谢谢 :)
【解决方案2】:

根据非单词边界拆分您的输入。

string.split("\\B");

\B 匹配两个非单词字符或两个单词字符。

DEMO

根据下面的正则进行拆分。

string.split("(?<!^)(?:\\B|\\b)(?!$)");

【讨论】:

  • 我可以知道原因吗?
  • 我不知道谁投了你的票,但我给了 +1。你的回答确实有效。
  • @AvinashRaj 你的解决方案有效 :) .. 但我需要知道 split 的原因
  • 因为它也根据第一个字符之前存在的空字符分割输入。
  • 为什么会有 3 个反对票?它非常适合他的特定输入。
【解决方案3】:

我已经尝试过您的代码,没有问题。

我认为可能有一个错误的空格并导致了问题。

使用trim() 来避免此类错误。

    String s="google";
    String[] s1=s.trim().split("");
    System.out.println(s1[0]);
    System.out.println(s1.length);

【讨论】:

  • 这不是问题的原因。查看接受的答案。
猜你喜欢
  • 2012-07-06
  • 2012-04-16
  • 2020-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多