使用正则表达式和 POSIX 字符 类 在 R 中验证密码
validating password in R with regex and POSIX character classes
我正在尝试使用正则表达式和 POSIX 字符 类 在 R 中验证密码。我知道相当多的正则表达式,但不知道 POSIX 部分。我在询问正则表达式问题时查阅了 SO 资源,外加六个 SO 问题和答案,例如 this and that。密码规则为:
- 一个大写字母
- 一个小写字母
- 一个或多个特殊字符(ASCII 标点符号)
- 8 到 32 个字符
- ASCII 可见且仅 space 个字符
我已经尝试了多种代码变体,如被注释掉的代码所示。我开始在较低级别构建正则表达式,然后逐步构建应包含所有要求的正则表达式。
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
我意识到即使结果显示 "valid",代码也无法正常工作。有人可以提供帮助吗?泰
与 l33t regex-fu 相比,我更喜欢可读的逻辑,这样其他人(或未来的自己)就可以理解正在发生的事情。
is_valid_password <- function(x) {
grepl('((?=.*[[:lower:]])(?=.*[[:upper:]])(?=.*[[:punct:]]).{8,32})', x, perl=TRUE) &
grepl("[[:print:][:space:]]", x)
}
pwds <- c("#Password", "_PASSWORD", "Password", "password", "passwor", "pAsswords", "Pa&sword", "Pa&s word")
is_valid_password(pwds)
## [1] TRUE FALSE FALSE FALSE FALSE FALSE TRUE TRUE
您可以使用以下正则表达式来验证:
is.validpw <- function(x) {
grepl('(?x) # free-spacing mode
^ # assert position = beginning of string
(?=.*[[:upper:]]) # match one uppercase letter
(?=.*[[:lower:]]) # match one lowercase letter
(?=.*[[:punct:]]) # match one special character
[ -~]{8,32} # match printable ascii characters
$ # assert position = end of string', x, perl = TRUE)
}
is.validpw(c('#Password', '_PASSWORD', 'Password', 'password',
'passwor', 'pAsswords', 'Pa&sword', 'Pa&s word'))
## [1] TRUE FALSE FALSE FALSE FALSE FALSE TRUE TRUE
我正在尝试使用正则表达式和 POSIX 字符 类 在 R 中验证密码。我知道相当多的正则表达式,但不知道 POSIX 部分。我在询问正则表达式问题时查阅了 SO 资源,外加六个 SO 问题和答案,例如 this and that。密码规则为:
- 一个大写字母
- 一个小写字母
- 一个或多个特殊字符(ASCII 标点符号)
- 8 到 32 个字符
- ASCII 可见且仅 space 个字符
我已经尝试了多种代码变体,如被注释掉的代码所示。我开始在较低级别构建正则表达式,然后逐步构建应包含所有要求的正则表达式。
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
我意识到即使结果显示 "valid",代码也无法正常工作。有人可以提供帮助吗?泰
与 l33t regex-fu 相比,我更喜欢可读的逻辑,这样其他人(或未来的自己)就可以理解正在发生的事情。
is_valid_password <- function(x) {
grepl('((?=.*[[:lower:]])(?=.*[[:upper:]])(?=.*[[:punct:]]).{8,32})', x, perl=TRUE) &
grepl("[[:print:][:space:]]", x)
}
pwds <- c("#Password", "_PASSWORD", "Password", "password", "passwor", "pAsswords", "Pa&sword", "Pa&s word")
is_valid_password(pwds)
## [1] TRUE FALSE FALSE FALSE FALSE FALSE TRUE TRUE
您可以使用以下正则表达式来验证:
is.validpw <- function(x) {
grepl('(?x) # free-spacing mode
^ # assert position = beginning of string
(?=.*[[:upper:]]) # match one uppercase letter
(?=.*[[:lower:]]) # match one lowercase letter
(?=.*[[:punct:]]) # match one special character
[ -~]{8,32} # match printable ascii characters
$ # assert position = end of string', x, perl = TRUE)
}
is.validpw(c('#Password', '_PASSWORD', 'Password', 'password',
'passwor', 'pAsswords', 'Pa&sword', 'Pa&s word'))
## [1] TRUE FALSE FALSE FALSE FALSE FALSE TRUE TRUE