Swift 5.1 - 是否有一种干净的方法来处理子字符串/模式匹配的位置

格里

我对 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 中,它应该是快速和简单的,但不是,我发现这非常令人困惑。

有人可以帮忙解决如何做

  1. 查找子串开始的位置

  2. 提取从子字符串结尾到文本结尾之间的所有文本

对不起,如果这是微不足道的 - 但苹果文档感觉非常复杂,而且很多例子已经有多年历史了。我似乎也找不到正则表达式的简单应用。

里奥·达布斯

您可以使用 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Swift 5中的简单字符串处理功能

有没有一种更简洁的方法来实例化对象A的5个,对象B的3个,对象C的1个,对象D的1个,全部都在一种方法内?

匹配包含逗号的字符串(例如1,5)

Microsoft Word中是否有一种方法可以用字符串“ 1”,“ 2”,“ 3”等搜索和替换字符串“ 01”,“ 02”,“ 03”?

在 Swift 中制作一系列进展系列的简单方法,如 1,3,5,

有没有一种方法可以拆分以下格式的列表:“字符串1”,“字符串2”,“字符串3”,

在 Swift 5 中的循环内修剪字符串

Swift Beta 5中的字符串到浮点转换

从字符串 iOS swift 5 转换日期

Swift 5 Firebase queryOrderedBy 字符串值

如何在 Swift 5 中转换字符串 URL?

如何在Swift 5中检查字符串是否包含多个字符

如何确定Swift 5中的拖放位置?

在另一种方法Swift中使用Post请求响应字符串

Swift 5,是否可以分解分配

删除 Swift 5 中的转义“\”字符

在 swift5 方法中使用 swift 泛型数组

如何检查字符串是否是 Swift 5 中的日期?

带有复杂JSON解码的Swift 5

swift Beta 5上没有bridgeToObjectiveC

Swift 5 - 帶有嵌套 JSON 的 JSONEncoder

UIPageViewController不调用委托方法(Swift 5)

在Swift 5中获取字符串md5

如何使用swift检查字符串是否仅包含1个字符

有没有一种理智的方法可以将具有未知结构的嵌套 JSON 解析为 Swift 5 中的对象或字典?

Swift4正确的方法来针对字符串测试子字符串?

Python-在数组的某些索引之间是否有一种聪明的方法来加1?

有没有一种方法可以找到两个5个字符的字符串之间的ASCII距离

如何在 Swift 5、Swift5 中使用带有 data.withUnsafeBytes() 的 try ?