ios - 使用 Swift 从字符串中检测数字年份
问题描述
我正在寻找一种检测年份的方法,例如 2019 年。我认为要求是数字连续,有四位数字,并且不与字母或特殊字符相邻。因此,我希望在以下每种情况下都返回“2019”的方法:
"2019"
"in 2019
"Before 2019, all IOS apps were written in one of 2 ways"
但将其排除在:
"1234z20191234
有很多方法可以检测字符串中的数字,如此处所示,例如
let newString = origString
.components(separatedBy:CharacterSet.decimalDigits.inverted)
.joined(separator: "")
但他们不会提取每个系列的数字来测试长度和邻接性。
数据检测器可以尝试提取日期,但从可能的日期到可能已经在起始文本中的年份似乎容易出错,例如使用以下内容:
“2018-08-31 04:00:00 +0000”, “America/Los_Angeles”, 18000.0
谁能建议一种从字符串中检索数字年份的可靠方法?
解决方案
[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) {
...
}
显然,如果您想缩小识别为年份的四位数字的范围,则必须调整正则表达式或用一些逻辑对其进行补充。但是您的问题并未确定您要使用什么标准来检测年份。
推荐阅读
- php - 在包内开发时,Laravel Mailable 找不到我的别名视图
- django - 处理 Django 迁移
- regex - 使用正则表达式搜索 ansible 解析日期
- java - 使用 BigDecimal Java / Kotlin 的表达式
- algorithm - 用户到资源映射算法
- visual-studio-code - 我可以将远程 Python 解释器(通过 SSH)添加到本地 VSCode 环境(即混合本地/远程 SSH 设置)吗?
- python - 如何从 Python 中检索 CouchDB 复制状态
- ssh - 我一直在经历烦人且不寻常的 ssh 行为。它只是挂起..超时
- arrays - 在 Powershell 中,为什么 foreach-object 循环不允许您从数组中检索单个值?
- php - 如何从 Laravel 执行 Oracle 存储过程