我需要在我的Swift应用程序中使用NSRegularExpression来检查用户通知的纬度和经度坐标是否格式正确。
我的正则表达式:-?[0-9]{1,3}[.]{1}[0-9]{6}
此正则表达式有效,但不完全有效。它使:
-
开始.
问题是:
?.-33.476543
-33555.476543
.
之后再粘贴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
}
}
您可以尝试以下方法:
"^-?[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而不是刹车线,则具有这种字符串。