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'
*編輯:添加了一個階段來刪除超過兩個空格的列表,將它們替換為保留雙逗號所需的兩個空格。
添加回答
舉報