はじめに
今回はログインやユーザー新規登録でのバリデーションについて記事を書きたいと思います。
言語はswift
で書きますが他の言語とあまり変わらない(少しは変わる)です。
また、正規表現をある程度学習していることを前提にしていますので正規表現の勉強をされていないかたは以下の記事を参考に勉強してから本記事を閲覧ください。
正規表現を勉強しよう!
Validatorクラス
validationを行なってくれるクラスを作ってメールアドレスとパスワードが想定した形になっているかチェックしてもらいます。
class Validator {
static func isEmail(_ email: String) -> Bool {
let pattern = "^[\\w\\.\\-_]+@[\\w\\.\\-_]+\\.[a-zA-Z]+$"
let matches = validate(str: email, pattern: pattern)
return matches.count > 0
}
static func isPassword(_ password: String) -> Bool {
let pattern = "^(?=.*?[^\\w])(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[\\d])[!-~]{8!,20}$"
let matches = validate(str: password, pattern: pattern)
return matches.count > 0
}
private static func validate(str: String, pattern: String) -> [NSTextCheckingResult] {
guard let regex = try? NSRegularExpression(pattern: pattern) else { return [] }
return regex.matches(in: str, range: NSRange(location: 0, length: str.count))
}
}
pattern
でメールアドレスやパスワードの構成を指定してvalidate関数に渡してあげます。
validate(str: ,pattern: )
はマッチした数のNSTextCheckingResult
を配列でかえしてくれます。
なので呼び出し先ではマッチした数が0より多かったらtrue
を返すという処理にしています。
上記のパターンが想定通りの判定をしてくれるか確認します。
メールアドレス
//想定通りの形
let email1 = "test@test.com"
//最後が英字がない
let email2 = "test@test."
//@の後に英数字がない
let email3 = "test@.com"
//先頭が英数字から始まらない
let email4 = "@test.com"
//@がない
let email5 = "test-test."
結果は...
email1: true
email2: false
email3: false
email4: false
email5: false
パスワード
//想定通りの形
let password1 = "Test@123"
//大文字がない
let password2 = "test@123"
//記号がない
let password3 = "test123"
//数字がない
let password4 = "test@test"
//文字数が足りていない
let password5 = "test@1"
結果は...
password1: true
password2: false
password3: false
password4: false
password5: false
上記のようになりました。
想定通りになっていますね。
最後に
今回swiftで正規表現を書いたのですが、本来\d
で表現できるところを\\d
と表現しないといけませんでした。
\d
と書くと
Invalid escape sequence in literal
と怒られるのでゆうとおりにしましょう。
また、メールアドレスの正規表現については厳密なメールアドレスの定義通りではないので実際利用しているメールアドレスでもfalse
になる場合があります。完璧な正規表現は難しいとのことなので今回はある程度の形を保証できるパターンで妥協しました。
わかりずらいところやもっとこうした方がいいなどのご意見がありましたらコメントお待ちしております。