3 回答
TA贡献1877条经验 获得超6个赞
也许您可以尝试使用更复杂的方法,使用复杂的正则表达式来匹配每行的六个字段,并显式处理第五个字段缺失值的情况。我重写了您的示例,添加了一些控制台日志,以澄清我的建议:
public class RegexTest {
private static final String Input = "a 3w 12 98 header P6124\n" +
"e 4t 2 100 header I803\n" +
"c 12L 11 437 M12";
public static void main(String[] args) throws Exception {
BufferedReader reader = new BufferedReader(new StringReader(Input));
String line = null;
Pattern pattern = Pattern.compile("^([^ ]+) +([^ ]+) +([^ ]+) +([^ ]+) +([^ ]+)? +([^ ]+)$");
do {
line = reader.readLine();
System.out.println(line);
if(line != null) {
String[] splitLine = line.split("\\s+");
System.out.println(splitLine.length);
System.out.println("Line: " + line);
Matcher matcher = pattern.matcher(line);
System.out.println("matches: " + matcher.matches());
System.out.println("groups: " + matcher.groupCount());
for(int i = 1; i <= matcher.groupCount(); i++) {
System.out.printf(" Group %d has value '%s'\n", i, matcher.group(i));
}
}
} while (line != null);
}
}
关键是用于匹配每一行的模式需要六个字段的序列:
对于每个字段,值描述为
[^ ]+
字段之间的分隔符描述为
+
第五个(可为空)字段的值描述为
[^ ]+?
使用括号将每个值捕获为一个组:
( ... )
每行的开始 (
^
) 和结束 ( ) 都被明确标记$
然后,每一行都与给定的模式进行匹配,获得六个组:您可以使用 访问每个组matcher.group(index)
,其中index
是从1 开始的,因为group(0)
返回完全匹配。
这是一种更复杂的方法,但我认为它可以帮助您解决问题。
TA贡献1790条经验 获得超9个赞
对可用于分割输入的空白字符数量进行限制。
对于您的示例数据,最多 5 个有效:
String[] splitLine = line.split("\\s{1,5}");
TA贡献1850条经验 获得超11个赞
您只是想将分隔符从空格切换为逗号吗?
在这种情况下: cat myFile.txt | sed 's/ */ /g' | sed 's/ /,/g'
*编辑:添加了一个阶段来删除超过两个空格的列表,将它们替换为保留双逗号所需的两个空格。
添加回答
举报