Swift - Finding a substring between two locations

2019-05-26 04:35发布

问题:

I have a string that is formatted like this: "XbfdASF;FBACasc|Piida;bfedsSA|XbbnSF;vsdfAs|"

Basiclly its an ID;ID| and then it repeats.

I have the first ID and I need to find it's partner Example: I have 'Piida' and I need to find the String that follows it after the ';' which is 'bfedsSA'

How do I do this?

The problem I am having is that the length of the IDs is dynamic so I need to get the index of '|' after the ID I have which is 'Piida' and then get the string that is between these indexes which in this case should be 'bfedsSA'.

回答1:

There are many ways to do this, but the easiest is to split the string into an array using a separator.

If you know JavaScript, it's the equivalent of the .split() string method; Swift does have this functionality, but as you see there, it can get a little messy. You can extend String like this to make it a bit simpler. For completeness, I'll include it here:

import Foundation

extension String {
    public func split(separator: String) -> [String] {
        if separator.isEmpty {
            return map(self) { String($0) }
        }
        if var pre = self.rangeOfString(separator) {
            var parts = [self.substringToIndex(pre.startIndex)]
            while let rng = self.rangeOfString(separator, range: pre.endIndex..<endIndex) {
                parts.append(self.substringWithRange(pre.endIndex..<rng.startIndex))
                pre = rng
            }
            parts.append(self.substringWithRange(pre.endIndex..<endIndex))
            return parts
        } else {
            return [self]
        }
    }
}

Now, you can call .split() on strings like this:

"test".split("e") // ["t", "st"]

So, what you should do first is split up your ID string into segments by your separator, which will be |, because that's how your IDs are separated:

let ids: [String] = "XbfdASF;FBACasc|Piida;bfedsSA|XbbnSF;vsdfAs|".split("|")

Now, you have a String array of your IDs that would look like this:

["XbfdASF;FBACasc", "Piida;bfedsSA", "XbbnSF;vsdfAs"]

Your IDs are in the format ID;VALUE, so you can split them again like this:

let pair: [String] = ids[anyIndex].split(";") // ["ID", "VALUE"]

You can access the ID at index 0 of that array and the value at index 1.

Example:

let id: String = ids[1].split(";")[0]
let code: String = ids[1].split(";")[1]

println("\(id): \(code)") // Piida: bfedsSA