簡體   English   中英

不超過兩個重復字母/數字的正則表達式

[英]Regular expression for no more than two repeated letters/digits

我需要處理 XSL 文件中不超過兩個相同字母/數字的正則表達式。

  • 沒有空間
  • 不支持特殊字符
  • 支持 (az,AZ,0-9)
  • 需要az之一
  • 需要 0-9 之一
  • 不超過 2 個相同的字母/數字(即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]+只允許字母和數字

編輯:從負前瞻中刪除了一個無關緊要的.*

要匹配連續重復 3 次或更多次的相同字符,請嘗試:

([a-zA-Z0-9])\1{2,}

樣品匹配(測試都在這里這里): AABBAA (不匹配), AABBBAAA (匹配BBBAAA ), ABABABABABABABA (不匹配), ABCCCCCCCCCC (比賽CCCCCCCCCC )。

這個對你有用嗎?

/(\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 個正則表達式中執行此操作:

  1. /^(?=.*[az])(?=.*[0-9])[a-z0-9]+$/i這將確保至少有 1 個數字和 1 個字母,同時只接受字母和數字(沒有空格或特殊字符)
  2. /([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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM