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
}