Swift 中的正则表达式无法完全正常工作

Regular expression in Swift not working fully

我需要在我的 Swift 应用程序中使用 NSRegularExpression 来检查用户通知的纬度和经度坐标的格式是否正确。

我的正则表达式:-?[0-9]{1,3}[.]{1}[0-9]{6}

这个正则表达式有效但不完全。它使:

  1. 坐标可以以-
  2. 开头
  3. 坐标可以从 3 个最大数字开始
  4. 那么字符.是必需的
  5. 完成需要 6 个数字,但不能更多

问题是:

  1. 如果我以每个字符开头,表达式 return 为真:?.-33.476543
  2. If then I paste more of 3 numbers the expression return true: -33555.476543
  3. 如果我在 . 表达式后粘贴更多的 6 个数字 return true: -33.476543546565565765

这很正常,但我如何创建一个 "patern" 来强制用户只通知 6 个号码或仅以 - 字符开头?

代码中的正则表达式:

let regex = NSRegularExpression("-?[0-9]{1,3}[.]{1}[0-9]{6}")
  if regex.matches(self.latitude) && regex.matches(self.longitude) {
    self.coordinatesValid = true
  } else {
    self.coordinatesValid = false
}

我的 NSRegularExpression 扩展:

import Foundation

extension NSRegularExpression {
  convenience init(_ pattern: String) {
    do {
      try self.init(pattern: pattern)
    } catch {
      preconditionFailure("Illegal regular expression: \(pattern).")
    }
  }

  func matches(_ string: String) -> Bool {
    let range = NSRange(location: 0, length: string.utf16.count)
    return firstMatch(in: string, options: [], range: range) != nil
  }
}

你可以试试这个:

"^-?[0-9]{1,3}[.]{1}[0-9]{6}$"

有:

  • ^ : 字符串的开始
  • $ : 字符串结束

以下是一些测试用例:

let latitudes = ["?.-33.476543", 
                 "-33555.476543",
                 "-33.476543546565565765",
                 "abc-333.476543xyz",
                 "-333.476543",
]

let regex = NSRegularExpression("^-?[0-9]{1,3}[.]{1}[0-9]{6}$")

for latitude in latitudes {
    print(regex.matches(latitude), "\t", latitude)
}

这是输出:

false    ?.-33.476543
false    -33555.476543
false    -33.476543546565565765
false    abc-333.476543xyz
true     -333.476543

我将此字符串扩展名用于 RexExp:

extension String {
    func match(_ regularExpression: String) -> Bool {
        return self.range(of: regularExpression, options: .regularExpression) != nil
    }
}

Swift 5 已添加文字字符串。这非常适合与正则表达式一起使用。

您可以像这样编写正则表达式而不对字符串进行换码:

#"([\w!#$%&'*+/=?`{|}~^-])+(?:\.[\w!#$%&'*+/=?`{|}~^-]+)*@[A-Za-z0-9.-]+\.[A-Za-z]{2,64}"#

请注意,您的字符串变成了 #,这意味着它是一个文字字符串,如果您编写 \n[=22 这样的字符串=] 那不是刹车线。