您可以使用 string range(of: String) 方法来查找字符串的范围,获取其上界并从字符串的该位置搜索行尾:
游乐场测试:
let sentence = """
Mary had a little lamb
@name: a name
@summary: a paragraph of text
{{something}}
a whole bunch of multi-line text
"""
if let start = sentence.range(of: "@name:")?.upperBound,
let end = sentence[start...].range(of: "\n")?.lowerBound {
let substring = sentence[start..<end]
print("name:", substring)
}
如果您需要从那里获取字符串到字符串的末尾,您可以使用 PartialRangeFrom:
if let start = sentence.range(of: "@summary:")?.upperBound {
let substring = sentence[start...]
print("summary:", substring)
}
如果你发现自己经常使用它,你可以扩展 StringProtocol 并创建自己的方法:
extension StringProtocol {
func substring<S:StringProtocol,T:StringProtocol>(between start: S, and end: T, options: String.CompareOptions = []) -> SubSequence? {
guard
let lower = range(of: start, options: options)?.upperBound,
let upper = self[lower...].range(of: end, options: options)?.lowerBound
else { return nil }
return self[lower..<upper]
}
func substring<S:StringProtocol>(after string: S, options: String.CompareOptions = []) -> SubSequence? {
guard
let lower = range(of: string, options: options)?.upperBound else { return nil }
return self[lower...]
}
}
用法:
let name = sentence.substring(between: "@name:", and: "\n") // " a name"
let sumary = sentence.substring(after: "@summary:") // " a paragraph of text\n\n{{something}}\n\na whole bunch of multi-line text"
你也可以使用正则表达式:
let name = sentence.substring(between: "@\\w+:", and: "\\n", options: .regularExpression) // " a name"