Давайте рассмотрим эту строку:
let str = """
10 Hello 980 world,
1975 Hello 1980 world,
1985p Hello :1995 world,
2000 Hello 2005p world,
2010 Hello 2015 world,
2019 Hello 2020 world,
2999
"""
Давайте объявим это регулярное выражение:
let pattern = "19[89]{1}[0-9]{1}(?![p])|20[01]{1}[0-9]{1}(?![p])"
let regex = try! NSRegularExpression(pattern: pattern)
Вот различные части шаблона:
19
соответствует буквам 19
буквально,
[89]{1}
соответствует одному символу в списке 89
, чтобы ограничить годы до 1980-х и 90-х,
[0-9]{1}
одна цифра за год,
(?![p])
отрицательный прогноз, то есть: не следует p
,
|
логическое ИЛИ,
20
соответствует буквам 20
буквально,
[01]{1}
соответствует одному символу в списке 01
, чтобы ограничить количество лет до 2000-х и 2010-х,
[0-9]{1}
одна цифра для года,
(?![p])
отрицательный прогноз, то есть: не следует p
.
Теперь давайте возьмем совпадения:
let matches =
regex.matches(in : str,
range : NSRange(location: 0, length: str.utf16.count))
for match in matches {
let range = match.range
if let swiftRange = Range(range, in: str) {
let name = str[swiftRange]
print(name)
}
}
Что печатает в консоли:
1980
1995
2000
2010
2015
2019
Имейте в виду, что это все равно будет соответствовать вещам, таким как 1990-е, 1999a, 19999999, поскольку вы только просили, чтобы за вами не следовал p.