0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

正規表現でバリデーション

Last updated at Posted at 2021-05-20

はじめに

今回はログインやユーザー新規登録でのバリデーションについて記事を書きたいと思います。
言語はswiftで書きますが他の言語とあまり変わらない(少しは変わる)です。
また、正規表現をある程度学習していることを前提にしていますので正規表現の勉強をされていないかたは以下の記事を参考に勉強してから本記事を閲覧ください。
正規表現を勉強しよう!

今回のコードはこちら

Validatorクラス

validationを行なってくれるクラスを作ってメールアドレスとパスワードが想定した形になっているかチェックしてもらいます。

Validator.swift
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になる場合があります。完璧な正規表現は難しいとのことなので今回はある程度の形を保証できるパターンで妥協しました。

わかりずらいところやもっとこうした方がいいなどのご意見がありましたらコメントお待ちしております。

参考

大文字小文字数字記号を最低1文字以上含む正規表現

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?