LoginSignup
16
12

More than 5 years have passed since last update.

[Swift3]文字列が人名かどうかをバリデーションする方法

Posted at

アプリからユーザの個人情報などをサーバに送る前にフィールド文字列が適切かどうかバリデーションチェックすることがあると思う。

人名(氏名)の指定文字列が適切かどうかのチェック方法を調べてみた。

ひらがなかどうか

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

16
12
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
16
12