使用 Swift 从字符串中检测数字年份
Detect numeric year from string using Swift
我正在寻找一种检测年份的方法,例如2019. 我认为要求是数字连续,有四位数字并且不与字母或特殊字符相邻。所以我想在以下每种情况下获得 return "2019" 的方法:
"2019"
"in 2019
"Before 2019, all IOS apps were written in one of 2 ways"
但将其排除在:
"1234z20191234
有很多方法可以检测字符串中的数字,如seen here,例如
let newString = origString
.components(separatedBy:CharacterSet.decimalDigits.inverted)
.joined(separator: "")
但他们不会拉出每个系列的数字来测试长度和相邻性。
数据检测器可以尝试提取一个日期,但是从可能的日期到可能已经在起始文本中的年份似乎容易出错,例如使用类似的东西:
“2018-08-31 04:00:00 +0000”, “America/Los_Angeles”, 18000.0
任何人都可以建议一种从字符串中检索数字年份的可靠方法吗?
您可以使用正则表达式,在单词边界 (\b
) 之间搜索四位数字 ([0-9]{4}
),例如
let strings = [
"2019",
"in 2019",
"Before 2019, all IOS apps were written in one of 2 ways",
"1234z20191234"
]
for string in strings {
if let range = string.range(of: #"\b[0-9]{4}\b"#, options: .regularExpression) {
let year = String(string[range])
print(year)
} else {
print("No year found")
}
}
制作中:
2019
2019
2019
No year found
注意,上面使用了Swift5的扩展字符串定界符,#"
和"#
。如果在较早的 Swift 版本中执行此操作,您将只想用另一个反斜杠转义反斜杠:
if let range = string.range(of: "\b[0-9]{4}\b", options: .regularExpression) {
...
}
很明显,如果你想缩小识别为年份的四位数字的范围,你必须调整正则表达式或用一些逻辑补充它。但是你的问题没有确定你想用什么标准来检测年份。
您可以使用正则表达式来做到这一点。此代码将查找给定字符串中的所有年份。您可以设置检查以确认号码在您希望接受的任何范围内。
func findYears(in text: String) -> [String] {
let yearRE = try! NSRegularExpression(pattern: "(?:\b)[0-9]{4}(?:\b)")
var results = [String]()
yearRE.enumerateMatches(in: text, range: NSRange(text.startIndex..<text.endIndex, in: text)) { (result, flags, stop) in
if let result = result {
let match = String(text[Range(result.range(at: 0), in: text)!])
// Set whatever range you wish to accept
if let year = Int(match), year > 1600 && year < 2200 {
results.append(match)
}
}
}
return results
}
let yearStrings = [
"2019",
"in 2019 and 2020",
"Before 2019, all IOS apps were written in one of 2 ways",
"1234z20191234",
"2018-08-31 04:00:00 +0000",
]
for yearString in yearStrings {
print(findYears(in: yearString))
}
输出:
["2019"]
["2019", "2020"]
["2019"]
[]
["2018"]
我正在寻找一种检测年份的方法,例如2019. 我认为要求是数字连续,有四位数字并且不与字母或特殊字符相邻。所以我想在以下每种情况下获得 return "2019" 的方法:
"2019"
"in 2019
"Before 2019, all IOS apps were written in one of 2 ways"
但将其排除在:
"1234z20191234
有很多方法可以检测字符串中的数字,如seen here,例如
let newString = origString
.components(separatedBy:CharacterSet.decimalDigits.inverted)
.joined(separator: "")
但他们不会拉出每个系列的数字来测试长度和相邻性。
数据检测器可以尝试提取一个日期,但是从可能的日期到可能已经在起始文本中的年份似乎容易出错,例如使用类似的东西:
“2018-08-31 04:00:00 +0000”, “America/Los_Angeles”, 18000.0
任何人都可以建议一种从字符串中检索数字年份的可靠方法吗?
您可以使用正则表达式,在单词边界 (\b
) 之间搜索四位数字 ([0-9]{4}
),例如
let strings = [
"2019",
"in 2019",
"Before 2019, all IOS apps were written in one of 2 ways",
"1234z20191234"
]
for string in strings {
if let range = string.range(of: #"\b[0-9]{4}\b"#, options: .regularExpression) {
let year = String(string[range])
print(year)
} else {
print("No year found")
}
}
制作中:
2019
2019
2019
No year found
注意,上面使用了Swift5的扩展字符串定界符,#"
和"#
。如果在较早的 Swift 版本中执行此操作,您将只想用另一个反斜杠转义反斜杠:
if let range = string.range(of: "\b[0-9]{4}\b", options: .regularExpression) {
...
}
很明显,如果你想缩小识别为年份的四位数字的范围,你必须调整正则表达式或用一些逻辑补充它。但是你的问题没有确定你想用什么标准来检测年份。
您可以使用正则表达式来做到这一点。此代码将查找给定字符串中的所有年份。您可以设置检查以确认号码在您希望接受的任何范围内。
func findYears(in text: String) -> [String] {
let yearRE = try! NSRegularExpression(pattern: "(?:\b)[0-9]{4}(?:\b)")
var results = [String]()
yearRE.enumerateMatches(in: text, range: NSRange(text.startIndex..<text.endIndex, in: text)) { (result, flags, stop) in
if let result = result {
let match = String(text[Range(result.range(at: 0), in: text)!])
// Set whatever range you wish to accept
if let year = Int(match), year > 1600 && year < 2200 {
results.append(match)
}
}
}
return results
}
let yearStrings = [
"2019",
"in 2019 and 2020",
"Before 2019, all IOS apps were written in one of 2 ways",
"1234z20191234",
"2018-08-31 04:00:00 +0000",
]
for yearString in yearStrings {
print(findYears(in: yearString))
}
输出:
["2019"]
["2019", "2020"]
["2019"]
[]
["2018"]