3 回答

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超6個(gè)贊
也許您可以嘗試使用更復(fù)雜的方法,使用復(fù)雜的正則表達(dá)式來匹配每行的六個(gè)字段,并顯式處理第五個(gè)字段缺失值的情況。我重寫了您的示例,添加了一些控制臺(tái)日志,以澄清我的建議:
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);
}
}
關(guān)鍵是用于匹配每一行的模式需要六個(gè)字段的序列:
對(duì)于每個(gè)字段,值描述為
[^ ]+
字段之間的分隔符描述為
+
第五個(gè)(可為空)字段的值描述為
[^ ]+?
使用括號(hào)將每個(gè)值捕獲為一個(gè)組:
( ... )
每行的開始 (
^
) 和結(jié)束 ( ) 都被明確標(biāo)記$
然后,每一行都與給定的模式進(jìn)行匹配,獲得六個(gè)組:您可以使用 訪問每個(gè)組matcher.group(index)
,其中index
是從1 開始的,因?yàn)?code>group(0)返回完全匹配。
這是一種更復(fù)雜的方法,但我認(rèn)為它可以幫助您解決問題。

TA貢獻(xiàn)1790條經(jīng)驗(yàn) 獲得超9個(gè)贊
對(duì)可用于分割輸入的空白字符數(shù)量進(jìn)行限制。
對(duì)于您的示例數(shù)據(jù),最多 5 個(gè)有效:
String[]?splitLine?=?line.split("\\s{1,5}");

TA貢獻(xiàn)1850條經(jīng)驗(yàn) 獲得超11個(gè)贊
您只是想將分隔符從空格切換為逗號(hào)嗎?
在這種情況下: cat myFile.txt | sed 's/ */ /g' | sed 's/ /,/g'
*編輯:添加了一個(gè)階段來刪除超過兩個(gè)空格的列表,將它們替換為保留雙逗號(hào)所需的兩個(gè)空格。
添加回答
舉報(bào)