Swift 4:从字符串返回子字符串索引

时间:2019-02-04 16:30:53

标签: swift string

我在这里检查了很多类似的问题,对于我来说,答案似乎并不是一个可行的解决方案。我正在将格式化的文件读入字符串"Substring #1: Hello World!; Substring #2: My name is Tom; Substring #X: This is another substring"中。我需要找到索引Substring #1才能打印其内容(Hello World!),稍后在代码中,我需要打印Substring #2My name is Tom)的内容,依此类推

到目前为止,我已经尝试过:

String.index(of: subString)-Xcode错误:

  

无法将“字符串”类型的值转换为预期的参数类型   “字符”

String.firstIndex(of: subString)-Xcode错误:`

  

无法将“字符串”类型的值转换为预期的参数类型   “字符”

有效的方法是什么?

1 个答案:

答案 0 :(得分:0)

您可以使用正则表达式来匹配您的字符串,假设所有子字符串以;或字符串结尾结尾。

这是您应该使用的正则表达式:

Substring #(\d+): (.+?)(?:;|$)

它将子字符串号捕获到组1中,并将子字符串捕获到组2中。

您可以像这样使用它:

extension String {
    func substring(withNSRange range: NSRange) -> String {
        return String(string[Range(range, in: self)!])
    }
}

let string = "Substring #1: Hello World!; Substring #2: My name is Tom"
let regex = try! NSRegularExpression(pattern: "Substring #(\\d+): (.+?)(?:;|$)", options: [])
let matches = regex.matches(in: string, options: [], range: NSRange(location: 0, length: string.utf16.count))
let tuples = matches.map { (Int(string.substring(withNSRange: $0.range(at: 1))), string.substring(withNSRange: $0.range(at: 2))) }
let dict = Dictionary(uniqueKeysWithValues: tuples)

// dict will contain something like [1: Hello World!, 2: My name is Tom]

编辑:

假设子字符串的自定义结尾存储在名为customStringEnd的变量中,则可以这样创建正则表达式:

let regex = try! NSRegularExpression(pattern: "Substring #(\\d+): (.+?)(?:\(NSRegularExpression.escapedPattern(for: customStringEnd))|$)", options: [])