如何在序列的最后一个出现位置分割字符串

5

目标:将带有内置分隔符的字符串拆分为int和另一个字符串。如果分隔符序列“###”出现多次,则该字符串应始终在最后一个“###”处拼接。

是否有像C#中的string.lastIndexOf("###")这样的运算符?

这是我的解析器的样子:

func parseTuple(from string: String) -> (String, Int)? {
    let parsedString = string.components(separatedBy: "###")
    if let tupleString = String(parsedString[0]), let tupleInt = Int(parsedString[1]) {
        return (tupleString, tupleInt)
    } else {
        return nil
    }
}

你能提供一个输入和输出的例子吗? - Luca Angeletti
Connect###Four###Player###7 应该被解析成字符串 "Connect###Four###Player" 和整数 7。因此,无论有多少个 '###',该函数都应该始终拆分最后一个并留下其余部分。 - procra
2个回答

7

Stringrange(of:...) 方法提供了一个 .backwards 选项来查找字符串的最后出现位置。 然后,substring(to:)substring(from:) 可以使用该范围的下限/上限提取分隔符之前/之后的字符串部分:

func parseTuple(from string: String) -> (String, Int)? {

    if let theRange = string.range(of: "###", options: .backwards),
        let i = Int(string.substring(from: theRange.upperBound)) {
        return (string.substring(to: theRange.lowerBound), i)
    } else {
        return nil
    }
}

例子:

if let tuple = parseTuple(from: "Connect###Four###Player###7") {
    print(tuple)
    // ("Connect###Four###Player", 7)
}

Swift 4 更新:


func parseTuple(from string: String) -> (String, Int)? {

    if let theRange = string.range(of: "###", options: .backwards),
        let i = Int(string[theRange.upperBound...]) {
        return (String(string[...theRange.lowerBound]), i)
    } else {
        return nil
    }
}

运行流畅 :). 谢谢。 - procra

3
let input = "Connect###Four###Player###7"

let seperator = "###"
// split components
var components = input.components(separatedBy: seperator)
// remove the last component ...
components = Array(components.dropLast())
// ... and re-join the remaining ones
let output = components.joined(separator: seperator)

print(output)

打印:

Connect###Four###Player

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接