Swift 中的正则表达式无法完全正常工作
Regular expression in Swift not working fully
我需要在我的 Swift 应用程序中使用 NSRegularExpression 来检查用户通知的纬度和经度坐标的格式是否正确。
我的正则表达式:-?[0-9]{1,3}[.]{1}[0-9]{6}
这个正则表达式有效但不完全。它使:
- 坐标可以以
-
开头
- 坐标可以从 3 个最大数字开始
- 那么字符
.
是必需的
- 完成需要 6 个数字,但不能更多
问题是:
- 如果我以每个字符开头,表达式 return 为真:
?.-33.476543
- If then I paste more of 3 numbers the expression return true:
-33555.476543
- 如果我在
.
表达式后粘贴更多的 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 这样的字符串=] 那不是刹车线。
我需要在我的 Swift 应用程序中使用 NSRegularExpression 来检查用户通知的纬度和经度坐标的格式是否正确。
我的正则表达式:-?[0-9]{1,3}[.]{1}[0-9]{6}
这个正则表达式有效但不完全。它使:
- 坐标可以以
-
开头
- 坐标可以从 3 个最大数字开始
- 那么字符
.
是必需的 - 完成需要 6 个数字,但不能更多
问题是:
- 如果我以每个字符开头,表达式 return 为真:
?.-33.476543
- If then I paste more of 3 numbers the expression return true:
-33555.476543
- 如果我在
.
表达式后粘贴更多的 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 这样的字符串=] 那不是刹车线。