我想使用正則表達式和POSIX字符類在R中驗證密碼。我知道大量的正則表達式,但不知道POSIX塊。在查詢正則表達式問題時,我查了一下SO資源,還有半打SO問題和答案,如this和that。密碼的規則是:使用正則表達式和POSIX字符類驗證R中的密碼
- 一個大寫字母
- 一個小寫字母
- 一個或多個特殊字符(ASCII標點符號)
- 8和32之間的字符
- ASCII可見和空格字符只有
我已經嘗試了一些代碼變體,如被註釋掉的代碼所示。我開始在較低的層次上構建正則表達式,然後按照正則表達式來處理,這些正則表達式應該包含所有需求。
ValidatePassword <- function(stringChar) {
# validPW <- "([[:lower:]]+[[:upper:]]+){8,32}"
# validPW <- "[[:lower:]]+[[:upper:]]+"
# validPW <- "^(?=.*[[:lower:]])(?=.*[[:upper:]])(?=.*[[:punct:]])[[:print:]]{8,32}$"
# validPW <- "^(?:[[:lower:]])(?:[[:upper:]])(?:[[:punct:]])[[:print:]]{8,32}$"
# validPW <- "^(?:.*[[:lower:]])(?:.*[[:upper:]])(?:.*[[:punct:]])[[:print:]]{8,32}$"
# validPW <- "^([[:lower:]]+|[[:upper:]]+|[[:punct:]]+)[[:print:]]{8,32}$"
# validPW <- "^(?=.*[a-z])(?=.*[A-Z])(?=.*[[:punct:]])[[:print:]]{8,32}$"
# validPW <- "^([[:lower:][:upper:][:punct:]])[[:print:]]{8,32}"
validPW <- "^([[:lower:]]+|[[:upper:]]+|[[:punct:]]+)[[:print:]]{8,32}$"
return(length(grep(validPW, stringChar, value = TRUE)))
}
ifelse(ValidatePassword("#Password"), "valid", "not valid") # valid
ifelse(ValidatePassword("_PASSWORD"), "valid", "not valid") # not valid
ifelse(ValidatePassword("Password"), "valid", "not valid") # not valid
ifelse(ValidatePassword("password"), "valid", "not valid") # not valid
ifelse(ValidatePassword("passwor"), "valid", "not valid") # not valid
ifelse(ValidatePassword("pAsswords"), "valid", "not valid") # not valid
ifelse(ValidatePassword("Pa&sword"), "valid", "not valid") # valid
ifelse(ValidatePassword("Pa&s word"), "valid", "not valid") # valid
我意識到即使結果顯示「有效」,代碼也不能正常工作。有人可以提供幫助嗎? ty
這個答案通過了長度測試,再加上幾個測試,我還沒有見過「free-spacing mode」,你可以稍微解釋一下,或者指給我解釋一下嗎?另外,(?x)是做什麼的? –
free-spacing模式允許在正則表達式中使用空格你可以在整個過程中進行評論,解釋每個部分。'(?x)'是允許這種模式的內聯修飾符。 – hwnd
我很好奇並將'[ - 〜]'重新編碼爲'[[:print:]]',最後破壞代碼,允許無效的密碼「pass word」潛入。 –