2009-11-04 55 views
4

我使用的BufferedReader讀取文件字符串,所以可以說我有比賽陣,與在Java中

line = br.readLine(); 

我要檢查,如果這條線包含了許多可能的字符串之一(我有一個數組)。我希望能夠寫類似:

while (!line.matches(stringArray) { // not sure how to write this conditional 
    do something here; 
    br.readLine(); 
} 

我是相當新的編程和Java,我要對這個正確的方式?

回答

3

複製所有值成Set<String>然後用:

Set<String> set = new HashSet<String> (Arrays.asList (stringArray)); 
while (!set.contains(line)) { ... } 

[編輯]如果你想找出是否的一部分,包含了從集的字符串,你必須循環在集合之上。用一個調用替換set.contains(line)

public boolean matches(Set<String> set, String line) { 
    for (String check: set) { 
     if (line.contains(check)) return true; 
    } 
    return false; 
} 

作出相應的調整要檢查你使用正則表達式或匹配更復雜的方法。

[EDIT2]第三個選項是|來連接在一個巨大的正則表達式的數組中的元素:

Pattern p = Pattern.compile("str1|str2|str3"); 

while (!p.matcher(line).find()) { // or matches for a whole-string match 
    ... 
} 

這可能是更便宜的,如果你有數組中的許多元素,因爲正則表達式的代碼會優化匹配過程。

+0

糾正我,如果我錯了,請不要檢查,看看數組是否包含從文件中讀取的行,而不是檢查行是否包含數組中的一個字符串? – karunga 2009-11-04 08:49:05

+0

你是絕對正確的;看到我的編輯更好的解決方案。 – 2009-11-04 08:56:32

+0

正則表達式然後依賴於字符串數組的內容。可能被視爲安全漏洞,具體取決於您檢查的條件。 – 2009-11-04 09:06:12

1

這取決於stringArray是什麼。如果這是一個Collection那麼罰款。如果它是一個真正的數組,你應該使它成爲CollectionCollection接口有一個名爲contains()的方法,該方法將確定給定的Object是否在Collection中。

簡單辦法把陣列到Collection

String tokens[] = { ... } 
List<String> list = Arrays.asList(tokens); 

問題與List是查找是昂貴(技術上線性或O(n))。更好的選擇是使用Set,它是無序的,但接近常數(O(1))查找。您可以構建一個這樣的:

Collection

Set<String> set = new HashSet<String>(stringList); 

從一個數組:

Set<String> set = new HashSet<String>(Arrays.asList(stringArray)); 

然後set.contains(line)將是一個廉價的操作。

編輯:好的,我認爲你的問題不清楚。您想要查看該行是否包含數組中的任何單詞。你想那麼什麼是這樣的:

BufferedReader in = null; 
Set<String> words = ... // construct this as per above 
try { 
    in = ... 
    while ((String line = in.readLine()) != null) { 
    for (String word : words) { 
     if (line.contains(word)) [ 
     // do whatever 
     } 
    } 
    } 
} catch (Exception e) { 
    e.printStackTrace(); 
} finally { 
    if (in != null) { try { in.close(); } catch (Exception e) { } } 
} 

這是一個相當粗糙檢查,這是令人驚訝的使用公開,往往給像「廢」字令人討厭的誤報。對於更復雜的解決方案,您可能需要使用正則表達式查找單詞邊界:

Pattern p = Pattern.compile("(?<=\\b)" + word + "(?=\b)"); 
Matcher m = p.matcher(line); 
if (m.find() { 
    // word found 
} 

你可能會想這樣做更有效率(如不編譯與每一行的模式),但是這是最基本的工具使用。

+0

注意正則表達式方法的安全含義 - 取決於數組中字符串的來源,這可能會破壞正則表達式並允許注入任意條件。 – 2009-11-04 09:07:57

0

使用String.matches(regex)函數,創建一個與字符串數組中任何一個字符串匹配的正則表達式怎麼樣?像

String regex = "*("; 
for(int i; i < array.length-1; ++i) 
    regex += array[i] + "|"; 
regex += array[array.length] + ")*"; 
while(line.matches(regex)) 
{ 
    //. . . 
} 
+0

-1這很容易出錯。根據字符串數組的內容,正則表達式會發生變化。甚至可以被視爲安全缺陷。 – 2009-11-04 09:04:51

+0

該數組從未被聲明爲靜態數組。你如何建議實現一個匹配動態數組的正則表達式,即「不變」? – 2009-11-04 09:10:09