在子字符串之前快速获取字符串

时间:2020-07-03 19:02:42

标签: swift indexing substring

我有一个字符串,这个字符串不断变化。

我抓住了我的一部分字符串,在代码中可以将其称为let mySub = "xyz"

原始字符串随时间变化,因此不用担心我如何获得mySub,在这个示例中,我们可以说字符串为let baseString = 123123xyz1234

在没有xyz的情况下,如何能够在没有硬编码的情况下捕获所有子字符串,所以xyz的位置可以不同并且子字符串捕获仍然可以正常进行?

2 个答案:

答案 0 :(得分:1)

您可以在mySub中找到baseString的第一个匹配范围,如果找到,则获取上一部分。

let baseString: String = "123123xyz1234"
let mySub = "xyz"
if let range = baseString.range(of: mySub) {
    let beforeStr = baseString[..<range.lowerBound]
}

答案 1 :(得分:0)

您可以获取子字符串范围的下限索引,并将子字符串向上扩展至该索引。如果您想对变音符号不区分大小写进行区分大小写,则可以使用localizedStandardRange:

extension StringProtocol  {
    func substring<S: StringProtocol>(upTo string: S, options: String.CompareOptions = []) -> SubSequence? {
        guard let lower = range(of: string, options: options)?.lowerBound
        else { return nil }
        return self[..<lower]
    }
    func localizedStandardSubstring<S: StringProtocol>(upTo string: S, options: String.CompareOptions = []) -> SubSequence? {
        guard let lower = localizedStandardRange(of: string)?.lowerBound
        else { return nil }
        return self[..<lower]
    }
}

let string = "123123xyz1234"
if let substring = string.substring(upTo: "xyz") {
    print(substring)  // "123123\n"
}

let localized = "123123café1234"
if let substring = localized.localizedStandardSubstring(upTo: "CAFE") {
    print(substring)  // "123123\n"
}