LoginSignup
2
2

More than 5 years have passed since last update.

Swift2.3でパスコード入力で英数字だけ入力させたい「絵文字を入力させたくない」

Last updated at Posted at 2016-11-09

swiftの正規表現に関する情報が少ない

あまりにも最近のswiftの正規表現に関する情報が少ないので

備忘録がてら残しておきます

シンプルにまとめようかと思いましたが

分かりづらくても細かく多くの情報があった方が

誰かが読み解けるかもしれないと思い

なるべく事細かにまとめましたが

分かりずらかったら、本当にすみません

正規表現で絵文字判定する

パスワード入力画面の実装の際、英数字キーボードにしても結局絵文字入力はできてしまい

入力されたパスワードはNSURLに渡すため文字が入力されてしまうと

スレッド1エラーになってしまうので

絵文字が入力されたら、エラーを返すという処理を実装しました

ポイントは、どうやって絵文字か否か見分けるかという点、

正規表現で英数字を指定し、入力された値と正規表現を比較すれば

そこに正規表現ではない文字が含まれていたら

エラー判定が可能だと気がつきました

NSRegularExpression を使う

swiftでは、正規表現を簡単に扱うことができません

全然モダンではありません

なのでNSRegularExpressionクラスに渡して

正規表現を正規表現として認識させる必要があります

だから、絵文字判定、正規表現を使うにはNSRegularExpressionを使いましょう

.
.
.

処理を呼び出して正規表現判定するコード
func tapBtn() {


        let reg = Regex.init("[0-9a-z]")
//変数regに正規表現を代入する
//Regexは絵文字判定をするクラス
//initでインスタンス化して.(ドット技法でアクセスしてる)
//"[0-9a-z]" は0~9またはa~zまでが来ることを指定している



        reg.test("hogehoge")//true
        reg.test("hogehogeあ")//false
//デバック確認




        if !reg.test(Code.value ?? "") {

//func test(input: String) -> Bool でtrueかfalseが返って来るので
//Code.valueがfalse(正規表現ではなかったら)は
//論理否定(if !)によって処理が通る

            print("英数字だけを入力してね")
//デバック確認

      return

//もし入力された値が正規表現("[0-9a-z]")の中にない場合はreturnで終了
        }

.
.
.

 NSRegularExpressionで絵文字を弾く処理


class Regex {
    let internalExpression: NSRegularExpression
//NSRegularExpressionを定義する

    let pattern: String
//定数patternを定義

    init(_ pattern: String) {
//initで関数を定義する
//引数patternには先ほどinitでインスタンス化、ドット技法でアクセスした正規表現("[0-9a-z]")が代入される

        self.pattern = pattern
//定数patternに渡された正規表現("[0-9a-z]")を代入する

        self.internalExpression = try! NSRegularExpression(pattern: pattern, options: .CaseInsensitive)
//定義したNSRegularExpression型の定数internalExpressionをselfで呼び出して try!で代入
//*ここに正規表現が入るわけで、これで正規表現が比較できるようになる。正規表現が使えるようになる。
//CaseInsensitiveは小文字と大文字を区別しないという意味
    }

    func test(input: String) -> Bool {
//関数testを定義して引数に、ユーザーが入力してきたパスワードが入る
//比較した結果が-> Boolでtrueかfalseかどちらかで返される
//!reg.test(Code.value ?? "")でアクセスされたCode.valueがユーザーが入力したパスワード


        let matches = self.internalExpression.matchesInString(input, options:  NSMatchingOptions(), range:NSMakeRange(0, input.characters.count))
//正規表現が入ってる("[0-9a-z]")internalExpressionにmatchesInStringを使い、文字を入力したinputでアクセス
//options:  NSMatchingOptions() オプションはなし
//inputの中の値をrange:NSMakeRange(0, input.characters.count))で一文字づつ取り出している

        return matches.count > 0
    }

2
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
2
2