2014-10-03 93 views
1

試圖驗證一串文本。規則是:如果存在超過3個字母或2個特殊字符,則表示正則表達式失敗

  • 只能有字母,數字,特殊(包括空格)
  • 不能有超過3個字母字符連續
  • 不能有2個以上的特殊字符連續

的如果正則表達式匹配,驗證應該失敗。

另外,這些工作,但我一直無法將它們正確地結合起來:

/^[^\x20-\x7F]+$/ - Regular expression to match all characters on a U.S. keyboard

/^(\w)\1{3,}$/ - Regex for detecting the same character more than five times?

無效的例子:

  • Thiiis會失敗。
  • 這將使222失敗2次。
  • !!也是不允許的。

用例不允許用戶在市場上發佈帖子(想想Craigslist)。

正則表達式引擎是Javascript在AngularJS指令。

加分:我還想讓用戶知道在字符串中失敗了什麼。目前,我做的是對單個字符,但不知道如何以最佳方式輸出連續失敗字符「!無效」:

當前工作代碼段:

var alphaNumeric = /^[^0-9a-zA-Z\- ]+$/; 
var charArray = new Array(); 
for (var i = 0; i < userstring.length; i++) { 
    if (alphaNumeric.test(userstring[i])) { 
     charArray.push(userstring[i]); 
    } 
} 
var errorMsg = charArray.join().toString() + " are invalid characters."; 

回答

1

您正在尋找zero-width look-ahead assertions

(?=^[\x20-\x7F]+$)(?!^.*?(\w)\1{2,}$).* 

請注意我對您建議的表達式所做的微妙更改,修復了它們中的錯誤。你的第三個要求是微不足道的,所以我把它作爲一個練習。

要了解如何工作的原則,通過閱讀我對這個主題的答案:Regexp Java for password validation


PS:仔細想想「美式鍵盤上的所有字符」是否是一種規範,你應該給任何關注,尤其是在Web應用程序的情況下。


獎勵:如果你想告知用戶什麼未能在字符串中,你不能在一個表達式做到這一點了,你必須回到測試針對個別規則列表。