Swift正则表达式

5
我希望测试用户输入,看是否与下面的正则表达式完全匹配。我该如何在Swift中执行这个操作? [a-zA-Z]+@[a-zA-Z]+.[a-zA-Z]

1
请分享您正在尝试的代码片段,并确保在.swift文件中编写Swift代码...如果您想使用Objective-C,则应使用桥接头文件。 - Sana
我刚刚决定将问题更加普遍化。 - fossdeep
1
可能是Swift中的正则表达式?的重复问题。 - Identity1
我不能评论那个,因为我的声望不够。那个解决方案是可行的,但由于我正在验证整个用户输入,即使只有一小部分用户输入包含它,它也会匹配,即使整个输入都是无效的。我已经尝试使用参数中的其他选项。 - fossdeep
与您实际的问题(如何在Swift中使用正则表达式)无关,但请注意,您的正则表达式非常错误,无法验证电子邮件地址。首先,您未转义的 .任何字符匹配,而不仅仅是一个点。另一个问题是,您不允许电子邮件到子域。还有一个问题是,您不允许在@之前有点。还有很多其他问题。如果要使用正则表达式,请考虑仅在验证失败时将其设为警告,而不是错误,因为编写允许所有有效地址的正确正则表达式非常困难。 - user743382
是的,我知道。我只是为了这个问题而随便写了一下。还没有调整好我的正则表达式。我想我本可以只写一个基本的[a-z]。不确定为什么我用了一个更复杂的。 - fossdeep
3个回答

6

看起来你正在尝试验证电子邮件地址。试试这个:

let test = "someone@somewhere.com"

do {
    let regex = try NSRegularExpression(pattern: "[a-zA-Z0-9]+@[a-zA-Z0-9]+.[a-zA-Z]", options: [])
    if regex.firstMatchInString(test, options: [], range: NSMakeRange(0, test.utf16.count)) != nil {
        print("matched")
    } else {
        print("not matched")
    }
} catch let error as NSError {
    print(error.localizedDescription)
}

NSRegularExpression仍然带有大量ObjC的遗留物,因此使用起来相当冗长。


这个有效。谢谢!但是将选项设置为[]是什么意思?我该如何找出来?我已经尝试过在Google上搜索并查看苹果文档,但是我找不到任何信息。 - fossdeep
2
[] 是一个空集合。options: [] 表示“没有选项”。这相当于 ObjC 中的 options: nil。请查看文档。如果 option 参数符合 OptionSetType,则可以使用步骤而不是按位“或”运算。文档:https://developer.apple.com/library/mac/documentation/Swift/Reference/Swift_OptionSetType_Protocol/ - Code Different
实际上,如果我试图验证整个用户输入,它将匹配"a@gmail.com",但也会匹配"sometext a@gmail.com"。正则表达式需要精细调整吗?还是应该使用不同的选项? - fossdeep
1
这个正则表达式验证电子邮件地址是错误的。它不允许数字,用户名的范围是错误的(应该是大写字母Z),点号应该被转义(否则它表示任何字符,你真的想匹配一个点)。请尝试使用这个正则表达式代替:"[a-zA-Z\d_]+@[a-zA-Z\d_]+\.[a-zA-Z\d_]+"(不是完美的,但更好一些)。 - pizzamonster
@pizzamonster 谢谢。我一直没有意识到这些错误。 - Code Different
由于这是基础内容,所以范围应该是test.utf16.count吗? - Joseph Lord

5

这里是使用Swift的一种方法,在不使用NSRegularExpression的情况下完成。但仍需要import Foundation

let email = "foo@bar.com"
if let _ = email.range(of: #"[a-zA-Z]+@[a-zA-Z]+.[a-zA-Z]"#,
                                 options: .regularExpression) {
    print("We have a match!")
}

0

我在所有的项目中都使用这个扩展:

extension String {
    func matchsIn(regexString: String) -> Bool {
        do { let regex = try NSRegularExpression(pattern: regexString, options: [])
             return regex.firstMatch(in: self, options: [], range: NSMakeRange(0, self.utf8.count)) != nil
        } catch { return false }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接