2017-01-11 204 views
-3

我有一個要求,使一個驗證以下幾點對斯威夫特的字母數字字符串正則表達式,我對如何實現這些目標沒有線索:正則表達式,沒有連續的字母和數字

  • 不超過連續4個字母或數字字符

    (如12345a或1abcde將是錯誤的,但123a45或abcd1e是正確的)

  • 不超過4相同的字母數字字符的

    (例如111a11或aaaa1a將是錯誤的)

  • 恰好6個字符

幫助將不勝感激,謝謝。

+4

是您的需求做一個正則表達式或執行這些限制?特別是第二部分是* regular *正則表達式不是爲了設計。總之,所有的正則表達式看起來都是這些需求的錯誤工具。 – luk2302

+0

as @ luk2302在他的評論中指出,即使只有條件1和條件3,這種方法也很複雜,您應該使用替代方案來解決這個問題 –

+0

要求是如果您不介意,可以執行這些限制你建議我一個更好的工具來獲得我所提到的? –

回答

0

正如其他人所指出的,你的第二個要求是很難單獨使用正則表達式來完成,而第一和第三是可以做到的:

^ 
(?!\D*\d{5,}\D*) 
(?![^A-Za-z]*[A-Za-z]{5,}[^A-Za-z]*) 
.{6} 
$ 

a demo on regex101.com

+0

我結束了使用你的正則表達式加上一個小函數來驗證第二點,謝謝你的幫助Jan –

0

做整體的工作,在每一個簡單的步驟: 注:這是一個JavaScript的解決方案,但你可以轉換爲您所選擇的語言遵循同樣的邏輯:

var str = "ss4sss"; 

fnTest = function(str){ 
    var isValid = true; 


    if(/\d{5,}/.test(str)){// no more than 4 consecutive numeric chars 
    return false; 
    }else if(/[a-z]{5,}/i.test(str)){// no more than 4 consecutive alpha chars 
    return false; 
    }else if(str.length !== 6){// not 6 characters 
    return false;  
    }else{ // any character used more than 4 times 
    var reg = /([\w\W])/g; 
    var arrM ; 
    var obj = {}; 
    while(arrM = reg.exec(str)){ 
     var letter = arrM[1]; 
     if(!obj[letter]){ 
     obj[letter] = 0; 
     } 
     obj[letter]++; 

     if(obj[letter] > 4){  
     isValid = false; 
     break; 
     } 
    } 
    } 
    return isValid; 
} 
fnTest(str); 
+0

我用一個非常相似的方法來驗證第二點,謝謝花時間回答。 –

相關問題