アプリからユーザの個人情報などをサーバに送る前にフィールド文字列が適切かどうかバリデーションチェックすることがあると思う。
人名(氏名)の指定文字列が適切かどうかのチェック方法を調べてみた。
ひらがなかどうか
NSPredicate
を使用して正規表現で評価することができる。
(Objective-C時代から何度も調べてる気がするが...。Swiftでも同様でした。)
String+Extension.swift
func isHiragana(_ str: String) -> Bool {
let regex = "^[ぁ-ゞ]+$"
let predicate = NSPredicate(format:"SELF MATCHES %@", regex)
return predicate.evaluate(with: str)
}
カタカナかどうか
カタカナもregex
の内容を変更するだけでOK!
String+Extension.swift
func isKatakana(_ str: String) -> Bool {
let regex = "^[ァ-ヾ]+$"
let predicate = NSPredicate(format:"SELF MATCHES %@", regex)
return predicate.evaluate(with: str)
}
漢字かどうか
漢字もregex
の内容を変更するだけでOK!
でも、漢字って一体何?
実は人名としての漢字の文字コード指定範囲は選定が結構むずい。
ググった結果、ここのサイトから以下のグループにすることにした。
コード | 内容 |
---|---|
3005 | 々 |
3007 | 〇 |
303b | 〻 |
3400 ~ 9fff | CJK統合漢字拡張A(+易経の六十四卦)+CJK統合漢字 |
f900 ~ faff | CJK互換漢字 |
20000 ~ 2ffff | CJK統合漢字拡張B〜D+CJK互換漢字追加 |
String+Extension.swift
func isKanji(_ str: String) -> Bool {
let regex = "^[\u{3005}\u{3007}\u{303b}\u{3400}-\u{9fff}\u{f900}-\u{faff}\u{20000}-\u{2ffff}]+$"
let predicate = NSPredicate(format:"SELF MATCHES %@", regex)
return predicate.evaluate(with: str)
}
氏名かどうか
人名のバリデーションは、上記のひらがな/カタカナ/漢字に英大文字/英小文字を条件に加えることにした。
String+Extension.swift
func isKanji(_ str: String) -> Bool {
let regex = "^[A-Za-zぁ-ゞァ-ヾ\u{3005}\u{3007}\u{303b}\u{3400}-\u{9fff}\u{f900}-\u{faff}\u{20000}-\u{2ffff}]+$"
let predicate = NSPredicate(format:"SELF MATCHES %@", regex)
return predicate.evaluate(with: str)
}
更にいい条件をご存知の方がいらっしゃったらお教え頂けると嬉しいです!
参考サイト:
Unicodeで「漢字」の正規表現
http://tama-san.com/kanji-regex/
Swiftでひらがなとカタカナのバリデーションをする
http://qiita.com/k-yamada@github/items/1c8c8a17a96516eb8311