2013-01-06 130 views
0

我想創建一個僅包含某些字符的單詞的String[]。比如我有一個包含多個字的,像這樣一本字典:在 攻擊 嘗試 關注 吸引力 權威 自動 清醒 嬰兒 回 壞 袋 創建只包含某些字符的字符串[]

手臂 軍隊 藝術 爲 餘額

我想縮小列表的範圍,以便它只包含單詞字符a,bg。因此在這個例子中列表應該只包含'bag'這​​個詞。 目前我正在嘗試使用正則表達式來做這件事,但是在我似乎無法使它正常工作之前從未使用它們。 這裏是我的代碼:

public class LetterJugglingMain { 
public static void main(String[] args) { 
    String dictFile = "/Users/simonrhillary/Desktop/Dictionary(3).txt"; 
    fileReader fr = new fileReader(); 
    fr.openFile(dictFile); 
    String[] dictionary = fr.fileToArray(); 
    String regx = "able"; 
    String[] newDict = createListOfValidWords(dictionary, regx); 
    printArray(newDict); 
} 

public static String[] createListOfValidWords(String[] d, String regex){ 
    List<String> narrowed = new ArrayList<String>(); 
    for(int i = 0; i<d.length; i++){ 
     if(d[i].matches(regex)){ 
      narrowed.add(d[i]); 
      System.out.println("added " + d[i]); 
     } 
    } 
    String[] narrowArray = narrowed.toArray(new String[0]); 
    return narrowArray; 
} 

但返回的數組始終是空的,除非字符串的正則表達式是確切的詞!有任何想法嗎?如果需要,我可以發佈更多的代碼......我想我必須嘗試初始化正則表達式錯誤。 縮小列表只能包含來自正則表達式的字符。

+1

您可能需要預見性。不過,我寧願在字符串中循環。 – nhahtdh

+0

你應該考慮使用番石榴,更具體地說,它的'CharMatcher'。 – fge

回答

1

OP要包含每個字符的單詞。不只是其中之一。 等字符不成問題。

如果是這種情況,我認爲最簡單的方法是循環整個字符串,逐個字符,並檢查它是否包含所有你想要的字符。保持標誌檢查並查看是否找到了每個角色。

如果是這種情況並非如此....:

嘗試使用正則表達式:

^[able]+$ 

這裏就是它的作用:

^字符串和$的開頭匹配匹配字符串的結尾。這確保你沒有得到部分匹配。

[able]你希望字符串組成的字符匹配,在這種情況下able+確保字符串中有一個或多個這些字符。

注:此正則表達式將匹配包含這4個字母的字符串。例如,它會匹配:

能,ALBE,aeble,aaaabbblllleeee

,並不會匹配

qable,可治療和體健。

+1

OP需要包含每個字符的單詞。不只是其中之一。其他角色不是問題。 –

+0

@Michael我的程序也需要爲許多不同的字母組做這個,我假設這是可能的,如果我創建了一個像這樣的「^ [] + $」的模板字符串,並且只需在括號之間放置所需的字母? –

+0

是的,只要那是你想要的結果,那就行得通了。如果@ JBNizet是正確的,那麼這是行不通的。 – Michael

2

正則表達式able將只匹配字符串"able"。然而,如果你想要一個正則表達式匹配a,b,le這兩個字符,你正在尋找的正則表達式是[able](括號內)。如果您想要包含多個此類字符的單詞,請添加+以重複該模式:[able]+

+3

OP需要包含每個字符的單詞。不只是其中之一。 –

0

這是一個示例正則表達式,用於過濾出至少包含一個集合中所有字符出現的單詞。這將匹配包含所有字符中的至少一個發生的a,b任何英文單詞(不區分大小寫),G:匹配將是bagbaggygrab的字符串的

(?i)(?=.*a)(?=.*b)(?=.*g)[a-z]+ 

實施例。

不匹配字符串的示例將是big,argument,nothing

(?i)表示開啓不區分大小寫的標誌。

對於每個字符,您需要爲集合中的字符數添加儘可能多的(?=.*<character>)

我假設一個字只包含英文字母,所以我指定[a-z]。指定更多,如果你需要的空間,連字符等

我認爲matches(String regex)方法String類,所以我省略了^$

性能可能是壞,因爲在最壞的情況下(字符在單詞的結尾處找到),我認爲的正則表達式引擎可能會通過串周邊的n次,其中n是集合中的字符數。這可能不是一個真正的問題,因爲這些詞很短,但如果事實證明這是一個瓶頸,你可能會考慮做簡單的循環。

2

坦率地說,我不是正則表達式的專家,但我不認爲它是做你想做的最好的工具。我會使用類似以下的方法:

public boolean containsAll(String s, Set<Character> chars) { 
    Set<Character> copy = new HashSet<Character>(); 
    for (int i = 0; i < s.length() && copy.size() < chars.size(); i++) { 
     char c = s.charAt(i); 
     if (chars.contains(c)) { 
      copy.add(c); 
     } 
    } 
    return copy.size() == chars.size(); 
} 
相關問題