[英]Regular expression for no more than two repeated letters/digits
我需要處理 XSL 文件中不超過兩個相同字母/數字的正則表達式。
BBB
將失敗, BB
被接受)到目前為止我所擁有的
(?:[^a-zA-Z0-9]{1,2})
這個正則表達式會這樣做: ^(?!.*([A-Za-z0-9])\\1{2})(?=.*[az])(?=.*\\d)[A-Za-z0-9]+$
這是細分:
(?!.*([A-Za-z0-9])\\1{2})
確保沒有一個字符連續重復兩次以上。
(?=.*[az])
至少需要一個小寫字母
(?=.*\\d)
至少需要一位
[A-Za-z0-9]+
只允許字母和數字
編輯:從負前瞻中刪除了一個無關緊要的.*
這個對你有用嗎?
/(\b(?:([A-Za-z0-9])(?!\2{2}))+\b)/
試試看:
var regex = new RegExp(/(\b(?:([A-Za-z0-9])(?!\2{2}))+\b)/)
var tests = ['A1D3E', 'AAAA', 'AABAA', 'abccddeeff', 'abbbc', '1234']
for(test in tests) {
console.log(tests[test] + ' - ' + Boolean(tests[test].match(regex)))
}
將輸出:
A1D3E - true
AAAA - false
AABAA - true
abccddeeff - true
abbbc - false
1234 - true
您可以在 2 個正則表達式中執行此操作:
/^(?=.*[az])(?=.*[0-9])[a-z0-9]+$/i
這將確保至少有 1 個數字和 1 個字母,同時只接受字母和數字(沒有空格或特殊字符)/([a-z0-9])\\1{2,}/i
如果匹配到這個,那么就有重復的字符了。 這意味着你應該拋出false
。第一個正則表達式:
^
: 匹配行首(?=.*[az])
: 檢查是否至少有一個字母(?=.*[0-9])
: 檢查是否至少有一位[a-z0-9]+
:如果檢查為真,則只匹配數字/字母一次或多次$
: 匹配行尾i
: 修飾符,匹配不區分大小寫第二個正則表達式:
([a-z0-9])
: 匹配和分組一個數字或一個字母\\1{2,}
: 匹配組 1 兩次或更多次i
: 修飾符,匹配不區分大小寫作為對澄清的回應,似乎並不嚴格要求單個正則表達式。 在這種情況下,我建議您使用幾個正則表達式或函數。 我的猜測是,性能不是必需的,因為通常這些類型的檢查是為了響應用戶輸入而完成的。 用戶輸入驗證可能需要 100 毫秒,而且看起來仍然是即時的,並且您可以在 100 毫秒內運行大量代碼。
例如,我個人會在單獨的測試中檢查您的每個條件。 首先,檢查空格。 其次,檢查至少一封信。 接下來,檢查至少一個數字。 最后,查找三個或更多重復字符的跨度。
您的代碼將更容易理解,並且以后修改規則也更容易(經驗表明,這幾乎肯定會發生)。
例如:
function do_validation(string) {
return (has_no_space(string) &&
has_no_special_char(string) &&
has_alpha(string) &&
has_digit(string) &&
! (has_repeating(string)))
我個人認為上述內容比一個復雜的正則表達式更容易閱讀。 另外,添加或刪除規則不會使您必須重新實現復雜的正則表達式(因此,需要重新測試所有可能的組合)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.