【发布时间】:2020-03-11 01:43:03
【问题描述】:
我需要在我的 Swift 应用程序中使用 NSRegularExpression 来检查用户通知的经纬度坐标的格式是否正确。
我的正则表达式:-?[0-9]{1,3}[.]{1}[0-9]{6}
这个正则表达式有效但不完全。它使:
- 坐标可以以
-开头 - 坐标可以以最多 3 个数字开头
- 那么字符
.是必须的 - 完成 6 个数字是必要的,但仅此而已
问题是:
- 如果我从每个字符开始,表达式返回 true:
?.-33.476543 - 如果我粘贴更多的 3 个数字,则表达式返回 true:
-33555.476543 - 如果我在
.之后粘贴更多的 6 个数字,则表达式返回 true:-33.476543546565565765
这很正常,但我如何创建“模式”来强制用户只通知 6 个数字或仅以 -character 开头?
代码中的正则表达式:
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
}
}
【问题讨论】:
-
您可以为模式添加边界以确保左右不是非空白字符
(?<!\S)-?[0-9]{1,3}[.]{1}[0-9]{6}(?!\S)regex101.com/r/0wgARe/1
标签: swift regex nsregularexpression