我希望测试用户输入,看是否与下面的正则表达式完全匹配。我该如何在Swift中执行这个操作?
[a-zA-Z]+@[a-zA-Z]+.[a-zA-Z]
看起来你正在尝试验证电子邮件地址。试试这个:
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的遗留物,因此使用起来相当冗长。
[]
是一个空集合。options: []
表示“没有选项”。这相当于 ObjC 中的 options: nil
。请查看文档。如果 option
参数符合 OptionSetType
,则可以使用步骤而不是按位“或”运算。文档:https://developer.apple.com/library/mac/documentation/Swift/Reference/Swift_OptionSetType_Protocol/ - Code Different这里是使用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!")
}
我在所有的项目中都使用这个扩展:
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 }
}
}
.swift
文件中编写Swift代码...如果您想使用Objective-C,则应使用桥接头文件。 - Sana.
与任何字符匹配,而不仅仅是一个点。另一个问题是,您不允许电子邮件到子域。还有一个问题是,您不允许在@
之前有点。还有很多其他问题。如果要使用正则表达式,请考虑仅在验证失败时将其设为警告,而不是错误,因为编写允许所有有效地址的正确正则表达式非常困难。 - user743382