2016-11-30 3 views
2

正規表現とPOSIX文字クラスを使用してRでパスワードを検証しようとしています。私は公平な量の正規表現を知っていますが、POSIXの部分は知っていません。私は、正規表現の質問に加えて、余分な12のSOの質問と回答、例えばthisthatのような質問をするときにSOのリソースを探しました。パスワードのルールは以下のとおりです。正規表現とPOSIX文字クラスでRでパスワードを検証する

  • ひとつの大文字
  • ひとつの小文字
  • 一つ以上の特殊文字(ASCIIの句読点)
  • 文字8〜32 ASCII可視および空白文字only

コメントアウトされているコードのように、いくつかのコードバリエーションを試しました。私は下位レベルで正規表現を構築し始め、すべての要件を含むはずの正規表現に向かって作業を進めました。

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

答えて

1

あなたは検証するために、次の正規表現を使用することができます。

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 
+0

この答えは、長さテストといくつかのテストを渡します。あなたは少し説明したり、どこかに説明することができますか?また、(?x)は何をしますか? –

+1

フリースペースモードでは正規表現内の空白が許されます。 – hwnd

+0

私は興味があり、 '[[〜:]]'に '[[:print:]]'と再コード化してしまいました。コードを壊し、無効なパスワード "パスワード"を覗き込めます。 –

1

私は、他の人間(または将来の自己)が何が起こっているのかを知るために、正規表現よりも読みやすい論理を好む傾向があります。

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 
+0

私は、これが最大の長さの試験条件を渡しているとは思いません。私は "123456789O12345678(o1234567890123"をpwds変数に追加し、関数はTRUEを返しています)私はまだこれを調べることができるかどうかを調べています –

関連する問題