2012-12-06 56 views
0

選擇的話,我使用這個代碼與至少兩個不同的字母

Matcher m2 = Pattern.compile("\\b[ABE]+\\b").matcher(key); 

只得到一個HashMap包含字母A,B或E

我不是,雖然感興趣的話鑰匙如AAAAAA或EEEEE,我需要至少帶有兩個不同字母的單詞(最好是三個)。

有沒有辦法修改正則表達式?任何人都可以提供這方面的見解

+3

如果你只有三個字母,這對我來說似乎很簡單。檢查每個字母是否存在(使用'String.indexOf()' - 相信我,這很快),如果是的話,增加一個計數器。然後檢查櫃檯。 – NullUserException

回答

1

替換除你的字母以外的所有東西,做一組結果,測試Set的大小。

public static void main (String args[]) 
{ 
    String alphabet = "ABC"; 
    String totest = "BBA"; 

    if (args.length == 2) 
    { 
     alphabet = args[0]; 
     totest = args[1]; 
    } 
    String cleared = totest.replaceAll ("[^" + alphabet + "]", ""); 
    char[] ca = cleared.toCharArray(); 
    Set <Character> unique = new HashSet <Character>(); 
    for (char c: ca) 
     unique.add (c); 
    System.out.println ("Result: " + (unique.size() > 1)); 
} 

例實施

-1

馬克所需字母明確地重複, 它應該是這樣的:

\b[ABE]{1,3}\b 

它匹配AAE,EEE,AEE但不AAAA,AAEE

+0

這不是OP要求的 - 「......至少有兩個不同的字母......」 – Jeff

0

你可以使用更復雜的正則表達式來完成它

(.*A.*[BE].*|.*[BE].*A.*)|(.*B.*[AE].*|.*[AE].*B.*)|(.*E.*[BA].*|.*[BA].*E.*) 

但它可能會更容易理解做某種替代的,比如做一個循環,在「」有時間來取代一個字母,檢查每一次新的字符串的大小 - 如果它改變了兩次字符串的大小,那麼你有兩個你想要的字符。 編輯:實際上,如果你在運行時知道之前的所需字符集,你可以在之前進行檢查,NullUserException在他的評論中正確 - indexOfcontains會比這更有效率,可能更具可讀性。

請注意,如果您想要的字符集是在編譯時未知的(或至少前串檢查在運行時),第二個選擇是最好 - 如果你正在尋找任何字符,只需更換所有在while(str.length > 0)循環中出現第一個字符 - 循環次數是您獲得的不同字符的數量。

相關問題