我对 Swift 非常非常陌生,不可否认的是,我对它的一些结构很挣扎。我必须使用文本文件并进行许多操作 - 这是一个示例来说明这一点:
假设我有这样的文字(多行)
Mary had a little lamb
@name: a name
@summary: a paragraph of text
{{something}}
a whole bunch of multi-line text
x----------------x
我希望能够做一些简单的事情,比如找到@name 的位置,然后将其拆分以获取名称等等。我已经在 javascript 中完成了这项工作,并且使用 substr 和正则表达式匹配非常简单。
在 swift 中,它应该是快速和简单的,但不是,我发现这非常令人困惑。
有人可以帮忙解决如何做
查找子串开始的位置
提取从子字符串结尾到文本结尾之间的所有文本
对不起,如果这是微不足道的 - 但苹果文档感觉非常复杂,而且很多例子已经有多年历史了。我似乎也找不到正则表达式的简单应用。
您可以使用 string range(of: String) 方法来查找字符串的范围,获取其 upperBound 并从字符串的该位置搜索行尾:
游乐场测试:
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"
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句