2013-02-01 43 views
0

我正在寫一個函數,如果參數是一個字符串,包含至少2個類別中的至少2個字符,則返回true :編寫一個函數,當4個組中至少有2個字符被發現時返回true

  • 小寫字母
  • 大寫字母
  • 位語法
  • 字符/一切

示例:

abAB => true 
aB => false 
ab12 => true 
1ab2 => true 
asdfasdf1 => false 

我正在研究一個正則表達式,但是我遇到了麻煩。我還考慮將正則表達式分解爲多個if語句,並分別檢查每個組中是否至少包含2個字符包含在字符串中。

例如:

comprised = 0 
if(string contains *[0-9]*[0-9]) 
    comprised = comprised+1 
if(string contains *[a-b]*[a-b]) 
    comprised = comprised+1 
if(string contains *[A-Z]*[A-Z]) 
    comprised = comprised+1 
if(string contains *[^0-9a-zA-Z]*[^0-9a-zA-Z]) 
    comprised = comprised+1 

if comprised >= 2 
    return true 
else return false 
+0

您可能要清理你的措辭,所以我們肯定知道是否你說的「至少2個字符它們來自2個類別「或」來自2個類別的兩個字符「。開頭的句子有點含糊不清,因爲您是否需要1或2個類別來計算它。 –

+0

@LeeMeador我想我在問第一個,所以我不希望它返回true,如果從兩個不同的組中獲取單個字符。 – Celeritas

+1

在這種情況下,我沒有看到正則表達式的nedd,請看看這個:[fiddle](http://rextester.com/PNVXM66645) – atomman

回答

3

在這種情況下真的不需要正則表達式。下面的java代碼顯示瞭解決它的另一種方法。

public static boolean validate(String s) { 
    int[] group = new int[4]; 
    for (char c : s.toCharArray()){ 
     group[getGroupForChar(c)]++; 
    } 
    int large = 0; 
    for (int g : group){ 
     if (g >= 2)large++; 
    } 
    return large>=2; 
} 
private static int getGroupForChar(char c) { 
    if (Character.isLowerCase(c))return 0; 
    else if (Character.isUpperCase(c))return 1; 
    else if (Character.isDigit(c))return 2; 
    return 3; 
} 
public static void main(String[] args) { 
    String[] tests = new String[]{ 
     "abAB", 
     "aB", 
     "ab12", 
     "1ab2", 
     "asdfasdf1" 
    }; 

    for (String s : tests) { 
     System.out.println(s+": "+validate(s)); 
    } 
} 

輸出:

abAB: true 
aB: false 
ab12: true 
1ab2: true 
asdfasdf1: false 

網站,您可以測試代碼:fiddle

+0

+1高效替代 – exexzian

+0

+1酷解決方案 –

1

.*[a-z].*[a-z].*將匹配帶有兩個小寫字符的任意字符串。

這個[a-z]將匹配一個小寫字母。

組成3個正則表達式,比如第一個正則表達式,然後應用它們來查看結果。如果在那裏,就算這個類別。

將其應用於測試後,使用第二個刪除該類型的所有字符或用空字符串或其他字符替換它們。

重複上,下和數字。然後看看是否有任何字符剩下,計算第4類。

如果計數是2或更多,那你就很好。

警告假定字符串中沒有末尾字符。

相關問題