私はSwiftで電子メール(文字列)を検証するための最もシンプルでクリーンな方法を探しています。 Objective-Cではこのメソッドを使用しましたが、Swiftに書き換えると、述語の作成時に「フォーマット文字列を解析できません」というエラーが表示されます。
- (BOOL) validateEmail: (NSString *) candidate {
NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}";
NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
return [emailTest evaluateWithObject:candidate];
}
かなり簡単に思えます。 Swift変換に問題がある場合、実際に試した結果を確認するのに役立つ場合があります。
これは私にとってはうまくいきます:
func validateEmail(candidate: String) -> Bool {
let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}"
return NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluateWithObject(candidate)
}
validateEmail("[email protected]") // true
validateEmail("invalid@@google.com") // false
Swift 3.0バージョン
func validateEmail(candidate: String) -> Bool {
let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}"
return NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluate(with: candidate)
}
validateEmail("[email protected]") // true
validateEmail("invalid@@google.com") // false
extension String
{
func isEmail() -> Bool
{
let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}"
return NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluateWithObject(self)
}
}
ここに私の2セントを投入し、カーブボールを打ちます。
このようにメールアドレスを検証してもよろしいですか?
これを参照してください blogpost これは、メールが有効であることを確認するために必要なすべてのことは、@
記号、または多くても@
が後に続く.
:
/.+@.+\..+/i
これは、すべてのメールドメインで機能する拡張機能です。
例:.com
、.co.uk
、.co.in
など.
extension String {
func isValidEmail() -> Bool {
let emailRegEx = "^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$"
let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
return emailTest.evaluateWithObject(self)
}
}
class func isValidEmail(email:String)-> Bool
{
let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
var emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
let result = emailTest!.evaluateWithObject(email)
return result
}
Craigsの回答は機能し、誰かがそれを実装するのに苦労している場合は、textFieldDidEndEditing関数がそれを呼び出しています。 (UITextFieldDelegateが必要です)
func textFieldDidEndEditing(textField: UITextField)
{
if validateEmail(emailAddress.text)
{
println("valid")
}
else
{
println("NOT valid")
}
}
func validateEmail(candidate: String) -> Bool {
let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}"
return NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluateWithObject(candidate)
}
NSDataDetector APIを使用しています。ここでの回答の多くは、メールアドレスで許可されている'
などの文字をサポートしていません。
extension String {
var isEmail: Bool {
let dataDetector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue)
let firstMatch = dataDetector?.firstMatch(in: self, options: NSRegularExpression.MatchingOptions.reportCompletion, range: NSRange(location: 0, length: count))
return (firstMatch?.range.location != NSNotFound && firstMatch?.url?.scheme == "mailto")
}
}
例えば.
"[email protected]".isEmail // true
"foo.mc'[email protected]".isEmail // true
私はAndroid SDKからうまく機能するこの正規表現も使用しました:
[a-zA-Z0-9\\+\\.\\_\\%\\-\\+]{1,256}\\@[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}(\\.[a-zA-Z0-9][a-zA-Z0-9\\-]{0,25})+
なぜAppleが電子メール検証のための文字列にメソッドを含まないだけなのかは謎です。
Swift 4は単に設定します:
extension String {
var isEmail: Bool {
let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
return emailTest.evaluate(with: self)
}
}
追加
UITextFieldDelegate
ViewDidLoadで:
yourTextField.delegate = self
使用法:
func textFieldDidEndEditing(_ textField: UITextField) {
guard let validEmailAddress = yourTextFiled.text else { return }
if !(validEmailAddress.isEmail) {
//is invalid address
} else {
//is valid address
}
}