2012-08-08 17 views
1

我有一個數據文件,其中每行代表一條記錄,每條記錄可能包含一個關鍵字列表,每個關鍵字都以「+」開頭。Java:我需要將數據解析爲數組的策略

foo1 foofoo foo foo foo +key1 +key2 +key3 
foo2 foo foo foofoo foo 
foo3 foo foofoo foo +key1 key1 key1 +key2 

有零和理論上無限數量的關鍵字之間。 關鍵字將總是以「+」開頭。 單個關鍵字可以是單個單詞或帶空格的短語。 我的確定關鍵字的策略:

我想將這些記錄讀入數組String keywords[]。我正在使用lineBuffer將數據導入,這是我迄今爲止的內容。

// PSEUDOCODE 
counter = [number of occurences of + in the line]; 
for(int i=0;i<=counter,i++) { 
    Pattern p = [regex reresenting + to the next occurence of + -or- end of line]; 
    Match pattern; 
    keyword[i] = Match.group(1) } 

我可能在想這個,但是Java知道去我的模式的下一個實例在同一行嗎?查看這幾行代碼,似乎我的模式匹配器會讀取該行,找到關鍵字的第一個實例並將其寫入數組i次數。它永遠不會獲得第二個關鍵字。

有沒有更好的方法來思考這個問題?創建此數組的更好策略?

回答

2

如果你知道有在鑰匙沒有+,你可以簡單地分割字符串:

String[] ss = s.split(" \\+"); 

和丟棄的第一個條目(foo的fooo ...)。

編輯

關於模式/正則表達式的問題,你也可以這樣做的:

Pattern p = Pattern.compile(" \\+\\w+"); 
Matcher m = p.matcher(s); 
while (m.find()) { 
    String key = m.group().trim().replaceAll("\\+",""); 
    System.out.println(key); 
} 
+1

我認爲這是更簡單的方法,但只是回答關於「但是Java知道去山姆的下一個模式實例的部分e行嗎?「,請檢查以下鏈接以查找有關匹配器對象的信息,可以做到這一點:http://docs.oracle.com/javase/tutorial/essential/regex/matcher.html – JTMon 2012-08-08 12:27:52

+0

@JTMon - 感謝鏈接!好東西! – dwwilson66 2012-08-08 12:33:47

+0

@JTMon我已經添加了一個例子。 – assylias 2012-08-08 12:36:35

1

這將是很容易用Scanner做:

Scanner s = new Scanner(line); 
int i = 0; 
while (s.hasNext()) { 
    String token = s.next(); 
    if (token.startsWith("+")) { 
     keyword[i] = token; 
     i++; 
    } 
}