Swift中的正则表达式无法完全使用

问题描述 投票:0回答:2

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

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

此正则表达式有效,但不完全有效。它使:

  1. 坐标可以以-开始
  2. 然后坐标可以从3个最大数字开始
  3. 然后需要字符.
  4. 完成6个数字是必要的,但没有更多

问题是:

  1. 如果我以每个字符开头,则表达式返回true:?.-33.476543
  2. 如果然后我再粘贴3个数字,则表达式返回true:-33555.476543
  3. 如果我在.之后再粘贴6个数字,则表达式返回true:-33.476543546565565765

这很正常,但是我如何创建一个“模式”以强制用户仅通知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
  }
}
swift regex nsregularexpression
2个回答
0
投票

您可以尝试以下方法:

"^-?[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

0
投票

我将此字符串扩展名用于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而不是刹车线,则具有这种字符串。

© www.soinside.com 2019 - 2024. All rights reserved.