Похоже, вам нужно сопоставить хэштег в конце строки или последний хэштег в строке.Таким образом, существует несколько способов решения проблемы.
Соответствие последнему хэштегу в строке
let str = "I made this wonderful pic last #chRistmas... #instagram #nofilter #snow #fun"
let regex = "#[[:alnum:]]++(?!.*#[[:alnum:]])"
if let range = str.range(of: regex, options: .regularExpression) {
let text: String = String(str[range])
print(text)
}
Подробности
#
- символ хеша [[:alnum:]]++
- 1 или более буквенно-цифровых символов (?!.*#[[:alnum:]])
- без буквенно-цифровых символов #
+ 1+ после любых 0+ символов, кроме символов разрыва строки сразусправа от текущего местоположения.
Соответствует хэштегу в конце строки
Тот же код, но со следующими регулярными выражениями:
let regex = "#[[:alnum:]]+$"
или
let regex = "#[[:alnum:]]+\\z"
Обратите внимание, что \z
соответствует самому концу строки, если между хэштегом и концом строки есть символ перевода строки, совпадений не будет (в случае $
, будет совпадение).
Примечание к регулярному выражению
Если хэштег должен начинаться только с буквы, лучше использовать
#[[:alpha:]][[:alnum:]]*
, где [[:alpha:]]
соответствует любой букве, а [[:alnum:]]*
соответствует 0+ буквам и / или цифрам.
Обратите внимание, что в шаблонах регулярных выражений ICU вы можетенапишите [[:alnum:]]
как [:alnum:]
.