パスワード設定の際に半角数字,半角英字,半角記号をそれぞれ最低でも 1 文字使用するよう求められるケースは多いと思います.今回は VBScript の正規表現を用いてパスワードをチェックする方法を紹介します.
制約条件を半角英数字,半角記号を最低でも 1 文字用いることとし,文字列長を 8 文字以上とします.下図のようにユーザーフォーム上にラベルとテキストボックスとコマンドボタンを配置します.それぞれ Label1, TextBox1, CommandButton1 とします.
下記コードの 23 行目で制約条件を表現します.コメントアウトした 22 行目は半角英数字のみを 8 文字以上用いる場合の正規表現です.文字クラス内でエスケープが必要なメタ文字は \ と ] の 2 種類です.
Option Explicit Private Sub CommandButton1_Click() With TextBox1 If Not CheckPassword(.Text) Then .SetFocus .SelStart = 0 .SelLength = Len(.Text) Exit Sub Else End If End With Unload Me End Sub Function CheckPassword(InputString As String) As Boolean Dim myReg As Object CheckPassword = False Set myReg = CreateObject("VBScript.RegExp") With myReg '.Pattern = "(?!^[0-9]*$)(?!^[a-zA-Z]*$)^([a-zA-Z0-9]{8,})$" .Pattern = "(?!^[0-9]*$)(?!^[a-zA-Z]*$)(?!^[!-/:-@[-`{-~]*$)(?!^[a-zA-Z0-9]*$)(?!^[!-@[-`{-~]*$)(?!^[!-/:-~]*$)^([!-~]{8,})$" .IgnoreCase = False .Global = True End With If myReg.Test(InputString) Then CheckPassword = True End If Set myReg = Nothing End Function Private Sub UserForm_Initialize() With TextBox1 .IMEMode = fmIMEModeDisable .PasswordChar = "*" End With End Sub
ここで解説が必要かと思います.(?!pattern) は否定先読みを示し,SQL で言うところの EXCEPT 演算子と同じ働きをします.半角英数字と半角記号を最低でも 1 文字以上使用するとは,下表の文字の組み合わせを許可しないということです.下図の 3 つの円の重なる領域を求めるには,その周辺の領域を引き算して求めます.許可しないパターンを否定先読みで予めフィルタリングしておき,最後に全種類の文字クラスの文字列長をチェックしています.集合論とも考え方の重なる領域です.ちなみに,n 種類の文字種を検証するのに必要な否定先読みのパターン数は 2n – 2 です.
Not Needed | Negative Lookahead Pattern |
Number | (?!^[0-9]*$) |
Character | (?!^[a-zA-Z]*$) |
Symbol | (?!^[!-/:-@[-`{-~]*$) |
Character and number | (?!^[a-zA-Z0-9]*$) |
Number and symbol | (?!^[!-@[-`{-~]*$) |
Character and symbol | (?!^[!-/:-~]*$) |
参照:
ASP.NET への入力を制約するために正規表現を使用する方法
正規表現の構文
ASCII文字コード(0-127)一覧表
インターフェースとしてのEXCEL VBAによるユーザーフォーム
古めの記事にコメント失礼します。どうやら否定先読みよりも肯定先読みのほうがシンプルに書けるようです。Qiitaのほうに引用させていただきましたのでよかったらご覧ください。
//qiita.com/mpyw/items/886218e7b418dfed254b
貴重な情報をありがとうございました.