[英]Swift Get substring after last occurrence of character in string
我正在創建一個帖子上傳頁面,該頁面需要檢測用戶何時鍵入“@”符號,以便它可以在數據庫中搜索用戶名。 我的代碼適用於字符串中的第一個“@”,但不適用於任何其他的。 我希望用戶能夠標記任意數量的用戶名。 例如:嘿@John 你今天和@Jim 交談了嗎?
這是我正在尋找的,但它已經過時了: 如何在字符串中最后一次出現字符后獲取 substring:Swift IOS
當前代碼:
var afterEqualsTo = ""
if let index = text.range(of: "@")?.upperBound {
let afterEqualsTo = String(text.suffix(from: index))
print(afterEqualsTo)
}
您可以使用 BidirectionalCollection 方法 lastIndex(of: Element) 並從那里獲取 substring 並刪除第一個字符:
var text = "Hello, playground! Hello World!!!"
var afterEqualsTo = ""
if let index = text.lastIndex(of: " ") {
let afterEqualsTo = String(text.suffix(from: index).dropFirst())
print(afterEqualsTo)
}
另一種選擇是在使用上面嘗試的字符串范圍時向后使用選項:
var text = "Hello, playground! Hello World!!!"
var afterEqualsTo = ""
if let index = text.range(of: " ", options: .backwards)?.upperBound {
let afterEqualsTo = String(text.suffix(from: index))
print(afterEqualsTo) // "World!!!\n"
}
如果您想獲取字符串中的所有用戶,您應該使用像"@\w+\b"
這樣的正則表達式並遍歷整個字符串。 如果您想從結果中排除字符 @ 您可以使用積極的后向模式,例如"(?<=@)\w+\b"
var text = "Hey @John did you talk to @Jim today?"
var ranges: [Range<String.Index>] = []
var start = text.startIndex
let pattern = #"@\w+\b"#
while start < text.endIndex,
let range = text[start...].range(of: pattern, options: .regularExpression) {
ranges.append(range)
start = text.index(range.upperBound, offsetBy: 1, limitedBy: text.endIndex) ?? text.endIndex
}
let users = ranges.map { text[$0] }
users // ["@John", "@Jim"]
或使用積極的后向模式"(?<=@)\w+\b"
users // ["John", "Jim"]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.