0

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

我怀疑这split是在第一个令牌之前取“无”并填充project[0],然后继续使用所有显示为正确的后续令牌。

Documentaion说这个方法有一个limit参数:

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

在 SO 上找到了这篇文章,但是提出的解决方案是编辑前导分隔符(我使用 asubstring(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
4

3 回答 3

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
于 2012-08-09T12:44:19.403 回答
1

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

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

编辑:就个人而言,我会使用正则表达式寻求更强大的解决方案。这会查找所有以 . 开头的关键字+。它还要求它+前面有一个空格或它在行首,这样单词 like3+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));
}
于 2012-08-09T12:50:46.477 回答
0

+foofoofoo +foo1 +foo2 +foo3

Splits 方法围绕给定 + 的匹配项拆分字符串,因此数组的第一个元素中包含一个空字段(包含 5 个元素)。如果您想获取以前的数据,请获取 inputLine 而不是处理后的 projStrTemp ,该子字符串来自第一个 + 包括在内。

于 2012-08-09T12:55:27.850 回答