3

I wrote extension that create split method:

extension String {
    func split(splitter: String) -> Array<String> {
        return self.componentsSeparatedByString(splitter)
    }
}

So in playground I can write:

var str = "Hello, playground"

if str.split(",").count > 1{
    var out = str.split(",")[0]

    println("output: \(out)") // output: Hello
}

What do I need to make it work with regex like in Java:

str.split("[ ]+")

Because this way it doesn't work.

Thanks,

1
  • I'd start with this method here: news.ycombinator.com/item?id=7890148. Run that, break off the string until the start of the found range and keep doing it until it returns NSNotFound. Commented Aug 13, 2014 at 21:05

1 Answer 1

10

First, your split function has some redundancy. It is enough to return

return self.componentsSeparatedByString(splitter)

Second, to work with a regular expression you just have to create a NSRegularExpression and then perhaps replace all occurrences with your own "stop string" and finally separate using that. E.g.

extension String {
    func split(regex pattern: String) -> [String] {
        let template = "-|*~~*~~*|-" /// Any string that isn't contained in the original string (self).

        let regex = try? NSRegularExpression(pattern: pattern)
        let modifiedString = regex?.stringByReplacingMatches(
            in: self,
            range: NSRange(
                location: 0,
                length: count
            ),
            withTemplate: template /// Replace with the template/stop string.
        )
        
        /// Split by the replaced string.
        return modifiedString?.components(separatedBy: template) ?? []
    }
}
Sign up to request clarification or add additional context in comments.

1 Comment

Perhaps better to put the Swift 5 version below or as a separate answer.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.