我正在解析一个输入文件,其中有多个关键字,前面有+
。 +
是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
答案 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,它包含来自第一个+的子串。