簡體   English   中英

Swift 獲取字符串中最后一次出現字符后的 substring

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM