Java字符串拆分函数行为奇怪

Java字符串拆分函数行为奇怪,java,string,split,Java,String,Split,在Java中使用split()方法时,我注意到了奇怪的行为 我有一个字符串如下:0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 String currentString[] = br.readLine().split("\\|"); System.out.println("Length:"+currentString.length); for(int i=0;i < currentString.length;i++){ System.out.

在Java中使用
split()
方法时,我注意到了奇怪的行为

我有一个字符串如下:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10

String currentString[] = br.readLine().split("\\|");
System.out.println("Length:"+currentString.length);
for(int i=0;i < currentString.length;i++){
     System.out.println(currentString[i]);
}
但是如果我收到字符串:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |

我得到以下结果:

Length: 8
0
1
2
3
4
5
6
7
8
最后两个空罐被省略。我需要把空的放好。不知道我做错了什么。我也尝试过以这种方式使用拆分<代码>拆分(“\\\\”,-1)

但这将返回长度为1的整个字符串


任何帮助都将不胜感激

您需要使用
indexOf()
,然后使用
substring()
,这样才能工作。我认为您不能仅使用
split()
清空字符串。

我认为这是split的默认行为,无论如何,请尝试以下操作:

字符串currentString[]=br.readLine().replace(“| |“,“| |”).split(“\|”); System.out.println(“长度:“+currentString.Length”); 对于(inti=0;i
这还没有经过测试,但我认为这应该可以解决问题。

我的Java有点生锈,但不应该是:

String currentString[] = "0|1|2|3|4|5|6|7|8||".split("\\|");
System.out.println("Length:"+currentString.length); 
for(int i = 0; i < currentString.length; i++)
{
  System.out.println(currentString[i]); 
} 
String currentString[]=“0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |”;
System.out.println(“长度:“+currentString.Length”);
对于(int i=0;i
拆分的默认行为是不返回空令牌(因为零限制)。使用限制为-1的双参数分割方法将在返回中为您提供所有空令牌

更新:

测试代码如下:

public class Test {
    public static void main(String[] args) {
    String currentString[] = "0|1|2|3|4|5|6|7|8||".split("\\|", -1);
    System.out.println("Length:"+currentString.length); 
    for(int i=0;i < currentString.length;i++){ System.out.println(currentString[i]); }
  }
}
Length:11
0
1
2
3
4
5
6
7
8
--- BLANK LINE --    
--- BLANK LINE --
我填写“---空行--”,表示报税表为空。8 |之后的空标记为空一次,最后一个|之后的空尾随标记为空一次


希望这能解决问题。

请检查以下代码,我使用了您的解决方案,它可以工作:


public class SplitTest 
{
    public static void main(String[] args)
    {
      String text = "0|1|2|3|4|5|6|7|8||";
      String pattern = "\\|";
      String [] array = text.split(pattern, -1);
          System.out.println("array length:" + array.length);
          for(int i=0; i< array.length; i++) 
          System.out.print(array[i]+ " ");
        } 
 }
输出为:

array length:11 0 1 2 3 4 5 6 7 8 阵列长度:11 0 1 2 3 4 5 6 7 8 String.split()很奇怪

从这方面和其他方面看,它的极端怪异是我们做出决定的一些原因


它的行为不那么令人惊讶,而且具有很大的灵活性。

请注意双反斜杠。这是因为split()的参数被解释为正则表达式。你想匹配字符
,它是用正则表达式
\\\\\\
完成的,正则表达式由字符串literal
“\\\\\\”
表示,我的代码有双斜杠,我不确定为什么它在论坛中翻译得不好。哦,好的。您应该能够编辑您的问题以反映这一点。@astro-这是因为您使用了
..
而不是StackOverflow wiki语法。我曾尝试使用我在文章中提到的-1,但它返回长度为1的整个字符串。如下所示:0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |不知道为什么?实际上,默认情况下,只删除尾随空格。下面是一些与您的问题无关的提示。我强烈建议您像Paulo Santos那样缩进代码,使其更易于阅读。此外,您的“C风格”for()循环可以替换为
for(String str:currentString){System.out.println(str);}
,这更容易阅读,也更难搞乱(例如,通过意外使用
,我还应该提到,如果我的字符串在第一个索引和最后一个索引之间的某些分隔符的值为空,它会很好地捕捉这些空白,只有在最后两个分隔符为空时,它才会表现出奇怪的行为。例如:0 | 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 1 2 6 7 8 10它对我来说可以使用-1。再次检查至少,你不会犯一个简单的错误,比如重新运行代码而不记得重新编译。感谢MatrixFrog提供的提示,我将按照你的建议进行更改。我不知道如何正确地用标记包围我的代码,以便像Paulo Santos那样格式化代码(我确实阅读了常见问题解答,但无法实现上面提到的backtick方法,并将其保留下来)。谢谢你的帮助和指导。嗯,不知道你的意思,你能给我举个例子吗?这让我更进一步,它增加了一个索引的长度,但错过了最后一个索引。这是因为最终索引的结尾是这样的|(值)不是| |所以永远不会添加空空格。我应该使用stringTokenizer方法吗?我知道它已被弃用,但我认为这会更有效,因为我不确定为什么它不能按预期运行。我不会说删除分隔符之间的空字符串很奇怪。奇怪的是,它只在E端,不在中间!
array length:11
0 1 2 3 4 5 6 7 8