字符串中最后一个字符出现后的Swift Get子字符串

字符串中最后一个字符出现后的Swift Get子字符串,swift,string,ios5,tags,character,Swift,String,Ios5,Tags,Character,我正在创建一个上传后页面,需要检测用户何时键入“@”符号,以便它可以在数据库中搜索用户名。我的代码适用于字符串中的第一个“@”,但不适用于任何其他字符串。我希望用户能够标记尽可能多的用户名。 例如:嘿,约翰,你今天和吉姆说话了吗 这是我正在寻找的,但它已过时: 当前代码: var afterEqualsTo = "" if let index = text.range(of: "@")?.upperBound { let afterEqualsT

我正在创建一个上传后页面,需要检测用户何时键入“@”符号,以便它可以在数据库中搜索用户名。我的代码适用于字符串中的第一个“@”,但不适用于任何其他字符串。我希望用户能够标记尽可能多的用户名。 例如:嘿,约翰,你今天和吉姆说话了吗

这是我正在寻找的,但它已过时:

当前代码:

var afterEqualsTo = ""
if let index = text.range(of: "@")?.upperBound {
    let afterEqualsTo = String(text.suffix(from: index))
    print(afterEqualsTo)
}

您可以使用BidirectionalCollection方法lastIndex(of:Element)从中获取子字符串并删除第一个字符:

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”
的正则表达式并迭代整个字符串。如果您想从结果中排除字符@,可以使用像
“(?谢谢!这很有效:)
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"]
users  // ["John", "Jim"]