我正在寻找一种检测年份的方法,例如2019。我认为要求是数字连续,四位数且不与字母或特殊字符相邻。因此,在以下每种情况下,我想获取返回“ 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
有人可以建议一种可靠的方法来从字符串中检索数字年份吗?
答案 0 :(得分:3)
您可以使用正则表达式,在单词边界([0-9]{4}
)之间搜索四位数(\b
),例如
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
找不到年份
请注意,以上代码使用了Swift 5的扩展字符串定界符#"
和"#
。如果在早期的Swift版本中执行此操作,则只需要用另一个反斜杠来转义反斜杠即可:
if let range = string.range(of: "\\b[0-9]{4}\\b", options: .regularExpression) {
...
}
很显然,如果您想缩小识别为年份的四位数的范围,则必须调整正则表达式或使用一些逻辑对其进行补充。但是您的问题并未确定您要使用什么标准来检测年份。
答案 1 :(得分:0)
您可以使用正则表达式执行此操作。此代码将查找给定字符串中的所有年份。您可以设置支票以确认号码在您希望接受的任何范围内。
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”]