こんにちは!株式会社メモリアインクのふくしまです!
この記事では、iOSアプリ開発におけるユーザ入力のバリデーション方法を学びます。特に、正規表現を利用して、文字列のフォーマットをチェックする技術に焦点を当てます。
この記事を読んで分かること…
・正規表現を用いたEメールアドレスのバリデーションの実装方法
・正規表現を用いたURLのバリデーションの実装方法
・正規表現を用いたパスワードのバリデーションの実装方法
正規表現を用いた入力バリデーションの実装方法
Eメールアドレス
正規表現を用いてEメールアドレスの入力バリデーションを実装します。
サンプルコード
import Foundation
func isValidEmail(_ email: String) -> Bool {
let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"
let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegex)
return emailTest.evaluate(with: email)
}
// 使用例
let email = "test@example.com"
print(isValidEmail(email)) // trueが返る場合、有効なEメールアドレス
// 出力結果:true
サンプルコードの説明
🔸4行目:正規表現部分
・[A-Za-z0-9.-]+
:メールアドレスの「ドメインパート」(つまり、”@”記号の後の部分)に相当します。大文字(A-Z)、小文字(a-z)、数字(0-9)、ドット(.)、ハイフン(-)のいずれかを含むことができます。+
は、直前の文字セット [A-Za-z0-9.-]
の1文字以上の繰り返しを意味します。
・@
:メールアドレスのローカルパートとドメインパートを区切るための記号です。
・[A-Za-z0-9.-]+
:メールアドレスの「ドメインパート」(つまり、”@”記号の後の部分)に相当します。大文字(A-Z)、小文字(a-z)、数字(0-9)、ドット(.)、ハイフン(-)のいずれかを含むことができます。+
は、直前の文字セット [A-Za-z0-9.-]
の1文字以上の繰り返しを意味します。
🔸5行目:NSPredicate
を使用して、特定の文字列(この場合はメールアドレス)が指定された正規表現パターンに一致するかどうかを評価。引数format
にはMATCHES
は、右側に指定された正規表現パターンと左側(SELF
)の文字列が一致するかどうかをチェックするための演算子です。%@
は、実際の正規表現パターン(この例ではemailRegex
変数の値)に置き換えられます。
🔸6行目:evaluate(with:)
メソッドは、指定された文字列(この例では"test@example.com"
)がemailRegex
によって定義された正規表現パターンに一致するかどうかを評価し、ブール値(true
またはfalse
)を返します。true
の場合、文字列はパターンに一致し、有効なメールアドレスと見なされます。false
の場合は、一致しないため無効です。
URL
正規表現を用いてURLの入力バリデーションを実装します。
サンプルコード
import Foundation
func isValidURL(_ urlString: String) -> Bool {
let urlRegex = "http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*'(),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+"
let urlTest = NSPredicate(format:"SELF MATCHES %@", urlRegex)
return urlTest.evaluate(with: urlString)
}
// 使用例
let urlString = "https://www.example.com"
print(isValidURL(urlString)) // trueが返る場合、有効なURL
// 出力結果:true
サンプルコードの説明
🔸4行目:正規表現部分
・http[s]?
:http
は、URLのスキームの一部で、ハイパーテキスト転送プロトコルを示します。[s]?
は、s
文字が0回または1回出現することを許可します。これにより、http
と https
の両方のスキームをマッチさせることができます。https
は、セキュアなHTTP接続を意味します。
・://
:スキームとホスト名を区切る標準的なパートです。
・(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*'(),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+
:
この部分は、URLのホスト名やパスに出現する可能性のある様々な文字をマッチさせます。?:
は、非キャプチャグループを開始します。これにより、グループ化は行われますが、マッチした部分文字列は記憶されません。[a-zA-Z]
は、アルファベットの大文字または小文字をマッチさせます。[0-9]
は、数字をマッチさせます。[$-_@.&+]
は、ドル記号、ハイフン、アンダースコア、アットマーク、ドット、アンパサンド、プラス記号をマッチさせます。URLによく使われる特殊文字です。[!*'(),]
は、特定のURLエンコードされていない特殊文字をマッチさせます。(?:%[0-9a-fA-F][0-9a-fA-F])
は、パーセントエンコーディングされた文字をマッチさせるためのもう一つの非キャプチャグループです。これは、URL内で許可されていない文字をエンコードするために使用されます(例: %20
は空白を表します)。
パスワード
正規表現を用いてパスワードの入力バリデーションを実装します。
パスワードのサンプルコード
import Foundation
func isValidPassword(_ password: String) -> Bool {
let passwordRegex = "(?=.*[A-Z])(?=.*[0-9])(?=.*[a-z])(?=.*[!@#$&*]).{8,}"
let passwordTest = NSPredicate(format: "SELF MATCHES %@", passwordRegex)
return passwordTest.evaluate(with: password)
}
// 使用例
let password = "StrongP@ssw0rd"
print(isValidPassword(password))
// 出力結果:true
サンプルコードの説明
🔸4行目:正規表現部分
・(?=.*[A-Z])
:少なくとも1つの大文字(A-Z)を含むことを要求します。.*
は任意の文字が0回以上繰り返されることを意味し、その後に大文字のアルファベットが1文字来ることを示します。
・(?=.*[0-9])
:少なくとも1つの数字(0-9)を含むことを要求します。ここでも.*
は任意の文字が0回以上繰り返されることを意味します。
・(?=.*[a-z])
:小文字(a-z)が少なくとも1つ含まれることを要求します
・(?=.*[!@#$&*])
:特殊文字(この例では!
、@
、#
、$
、&
、*
のいずれか)が少なくとも1つ含まれることを要求します。
・.{8,}
:このパスワードが少なくとも8文字以上であることを要求します。.
は任意の文字を表し、{8,}
はその文字が8回以上繰り返されることを意味します。
まとめ
いかがでしたか?
本記事では、Swiftで正規表現を利用して入力バリデーションを実装する方法について、高頻度で使われる例を元にサンプルコードを示しながら解説しました。
バリデーションを実装することで、アプリケーションは不正なデータの入力を防ぎ、データの整合性を保ちながら、ユーザーに対してより安全で信頼性の高いサービスを提供することが可能になるでしょう。
この記事が、皆様のiOS開発のお役に立てると幸いです!
この記事があなたのスキルアップに役立ったなら、次のキャリアステップを踏み出す絶好の機会かもしれません。エンジニアとしてのさらなる成長と挑戦を求めるなら、
未経験からIT・Webエンジニアを目指すなら【ユニゾンキャリア】
コメント