Swift 获取字符串中最后一个字符出现后的子字符串
Swift Get substring after last occurrence of character in string
我正在创建一个 post 上传页面,该页面需要检测用户何时键入“@”符号,以便它可以在数据库中搜索用户名。我的代码适用于字符串中的第一个“@”,但不适用于任何其他代码。我希望用户能够标记任意数量的用户名。
例如:嘿@John 你今天和@Jim 谈过了吗?
这就是我要找的东西,但它已经过时了:
当前代码:
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"
这样的正则表达式并遍历你的整个字符串。如果你想从你的结果中排除字符 @ 你可以使用像 "(?<=@)\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[[=12=]] }
users // ["@John", "@Jim"]
或使用正后视模式"(?<=@)\w+\b"
users // ["John", "Jim"]
我正在创建一个 post 上传页面,该页面需要检测用户何时键入“@”符号,以便它可以在数据库中搜索用户名。我的代码适用于字符串中的第一个“@”,但不适用于任何其他代码。我希望用户能够标记任意数量的用户名。 例如:嘿@John 你今天和@Jim 谈过了吗?
这就是我要找的东西,但它已经过时了:
当前代码:
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"
这样的正则表达式并遍历你的整个字符串。如果你想从你的结果中排除字符 @ 你可以使用像 "(?<=@)\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[[=12=]] }
users // ["@John", "@Jim"]
或使用正后视模式"(?<=@)\w+\b"
users // ["John", "Jim"]