Java的split方法有空白的记录,我无法抑制

时间:2012-08-09 12:39:02

标签: java string parsing split

我正在解析一个输入文件,其中有多个关键字,前面有++split中的分隔符,单个标记被写入数组。结果数组包含[0]位置的空白记录。

我怀疑split在第一个令牌之前“没有”并填充project[0],然后转到后续令牌,这些令牌都显示为正确。

Documentaion表示此方法有limit参数:

  

如果n为零,那么模式将被应用多次   可能,数组可以有任何长度,并且尾随空字符串   将被丢弃。

我找到了this post on SO,但是提出的解决方案,编辑出前导分隔符(我使用substring(1)来创建临时字段)为我产生了相同的空白记录。

下面的代码和输出代码。任何提示将不胜感激。

import java.util.regex.*;
import java.io.*;
import java.nio.file.*;
import java.lang.*;
//
public class eadd
{
    public static void main(String args[])
    {
        String projStrTemp = "";
        String projString = "";
        String[] project = new String[10];
        int contextSOF = 0;
        int projStringSOF = 0;
        int projStringEOF = 0;
       //
        String inputLine = "foo foofoo foo foo @bar.com +foofoofoo +foo1 +foo2 +foo3";
        contextSOF = inputLine.indexOf("@");
        int tempCalc = (inputLine.indexOf("+")) ;
        if (tempCalc == -1) {
            proj StrTemp = "+Uncategorized";
        } else {
            projStringSOF = inputLine.indexOf("+",contextSOF);
            projStrTemp = inputLine.trim().substring(projStringSOF).trim();
        }
        project = projStrTemp.split("\\+");
       //
        System.out.println(projStrTemp+"\n"+projString);
        for(int j=0;j<project.length;j++) {
        System.out.println("Project["+j+"] "+project[j]);
        }
    }

CONSOLE OUTPUT: 
+foofoofoo +foo1 +foo2 +foo3

Project[0]
Project[1] foofoofoo
Project[2] foo1
Project[3] foo2
Project[4] foo3

3 个答案:

答案 0 :(得分:2)

变化:

projStrTemp = inputLine.trim().substring(projStringSOF).trim();

为:

projStrTemp = inputLine.trim().substring(projStringSOF + 1).trim();

如果您有一个前导分隔符,则数组将以空白元素开头。您可能值得在没有其他所有行李的情况下试验split()

public static void main(String[] args) {
    String s = "an+example";

    String[] items = s.split("\\+");
    for (int i = 0; i < items.length; i++) {
        System.out.println(i + " = " + items[i]);
    }
}

使用String s = "an+example";生成:

0 = an
1 = example

String s = "+an+example";产生:

0 = 
1 = an
2 = example

答案 1 :(得分:1)

一个简单的解决方案是从字符串中删除第一个+。这样,它就不会在第一个关键字之前拆分:

projStrTemp = inputLine.trim().substring(projStringSOF + 1).trim();

编辑:就个人而言,我会使用正则表达式寻求更强大的解决方案。这会找到所有以+开头的关键字。它还要求+前面有空格或位于行的开头,以便3+4之类的单词不匹配。

String inputLine = "+foo 3+4 foofoo foo foo @bar.com +foofoofoo +foo1 +foo2 +foo3";
Pattern re = Pattern.compile("(\\s|^)\\+(\\w+)");
Matcher m = re.matcher(inputLine);
while (m.find()) {
    System.out.println(m.group(2));
}

答案 2 :(得分:0)

+ foofoofoo + foo1 + foo2 + foo3

Splits方法将字符串拆分为给定+的匹配,因此数组在第一个元素中包含一个空字段(包含5个元素)。如果你想获得之前的数据,请获取inputLine而不是处理过的projStrTemp,它包含来自第一个+的子串。