切片字符串 Swift

J·斯科特

我想将一个很长的字符串从一个词切到另一个词。我想得到这些词之间的子串。为此,我使用以下字符串扩展名:

 extension String {
 func slice(from: String, to: String) -> String? {

 guard let rangeFrom = range(of: from)?.upperBound else { return nil }

 guard let rangeTo = self[rangeFrom...].range(of: to)?.lowerBound else { return nil }

 return String(self[rangeFrom..<rangeTo])
 }

这确实很好用,但是我的原始字符串包含一些“从”“到”字词,我需要这两个词之间的每个子字符串,但是使用我的扩展名,我只能获得第一个子字符串。

例子:

let raw = "id:244476end36475677id:383848448end334566777788id:55678900end543"

我想从这个原始字符串示例中获取以下子字符串:

sub1 = "244476"
sub2 = "383848448"
sub3 = "55678900"

如果我打电话:

var text = raw.slice(from: "id:" , to: "end")

我只得到第一次出现 (text = "244476")

感谢您的阅读。每个答案都会很好。

PS:在stackoverflow中制作代码片段时总是出错。

里奥·达布斯

您可以使用 while 循环获取子字符串的范围,以从该点到字符串末尾重复搜索,并使用 map 从结果范围中获取子字符串:

extension StringProtocol {
    func ranges<S:StringProtocol,T:StringProtocol>(between start: S, and end: T, options: String.CompareOptions = []) -> [Range<Index>] {
        var ranges: [Range<Index>] = []
        var startIndex = self.startIndex
        while startIndex < endIndex,
            let lower = self[startIndex...].range(of: start, options: options)?.upperBound,
            let range = self[lower...].range(of: end, options: options) {
            let upper = range.lowerBound
            ranges.append(lower..<upper)
            startIndex = range.upperBound
        }
        return ranges
    }
    func substrings<S:StringProtocol,T:StringProtocol>(between start: S, and end: T, options: String.CompareOptions = []) -> [SubSequence] {
        ranges(between: start, and: end, options: options).map{self[$0]}
    }
}

游乐场测试:

let string = """
your text
id:244476end
id:383848448end
id:55678900end
the end
"""

let substrings = string.substrings(between: "id:", and: "end")  // ["244476", "383848448", "55678900"]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章