【问题标题】:Swift regular expressions斯威夫特正则表达式
【发布时间】:2015-12-25 03:08:11
【问题描述】:

我想测试用户输入以查看整个输入是否与以下正则表达式匹配。我如何用 Swift 做到这一点?

[a-zA-Z]+@[a-zA-Z]+.[a-zA-Z]

【问题讨论】:

  • 分享你正在尝试的代码 sn-p,同时确保你在.swift 文件中编写了一个快速代码......如果你想使用 Objective-C,你应该使用一个桥接头。
  • 我只是决定把这个问题说得更笼统一些。
  • RegEx in Swift?的可能重复
  • 我无法对此发表评论,因为我没有足够的代表。该解决方案有效,但由于我正在验证整个用户输入,因此即使只有一小部分用户输入包含它,即使整个内容无效,它也会匹配。我尝试在参数中使用其他选项。
  • 与您的实际问题无关(如何在 swift 中使用正则表达式),但请注意您的正则表达式对于验证电子邮件地址是非常错误的。对于初学者,您使用未转义的 . 匹配 any 字符,而不仅仅是一个点。另一个问题是您不允许向子域发送电子邮件。还有一个问题是您不允许在@ 之前使用点。还有很多其他问题。如果您想使用正则表达式,请考虑仅在验证失败时将其作为警告,而不是错误,因为允许所有有效地址的正确正则表达式非常难以编写。

标签: regex swift


【解决方案1】:

您似乎正在尝试验证电子邮件地址。试试这个:

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 遗产,因此使用起来非常冗长。

【讨论】:

  • 这行得通。谢谢!但是将选项设置为 [] 是什么意思?我怎么知道?我试过用谷歌搜索它,并查看 Apple 文档,但找不到任何信息。
  • [] 是一个空集。 options: [] 表示“没有选择”。它相当于 ObjC 中的options: nil。检查文档。如果option 参数符合OptionSetType,您可以使用步进而不是按位or。文档:developer.apple.com/library/mac/documentation/Swift/Reference/…
  • 其实,如果我试图验证整个用户输入,它会匹配“a@gmail.com”,但也会匹配“sometext a@gmail.com” 正则表达式是否需要进行改进,还是我应该使用其他选项?
  • 这个正则表达式在验证电子邮件地址时是错误的。它不允许数字,用户名的范围是错误的(应该是大写 Z)并且点应该被转义(现在它意味着任何字符,你真的想匹配一个点)。试试这个:“[a-zA-Z\\d_]+@[a-zA-Z\\d_]+\\.[a-zA-Z\\d_]+”(不完美,只是更好。 )
  • @pizzamonster 谢谢。没想到我一直犯这些错误
【解决方案2】:

这是一种在 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!")
}

【讨论】:

    【解决方案3】:

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

    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 }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-07-22
      • 2017-03-24
      • 1970-01-01
      • 1970-01-01
      • 2016-02-08
      • 2017-11-13
      • 2015-08-19
      • 2014-09-11
      • 1970-01-01
      相关资源
      最近更新 更多