Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift - Splitting strings with regex - ignoring search string

There is a clever 1st answer given here for splitting swift string with a regex expression

split string answer

However it keeps the searched text within the array of answers. I'm trying to do a similar thing, but ignoring the characters acting as separators (e.g. just like the swift split function, but just with a regex expression as the separator).

As an example: regex would be something like

"\\\||Z|ZY"

and when applied to string of "hi|thisZshouldZYbe|separated" then you would get back an array

["hi", "this", "should", "be", "separated"]

NB. The regex is adapted to the swift NSRegularExpression format with the double escape. In regular regex it would just be "\||Z|ZY" Also NB the regex contains the vertical line symbol not the letter "l"

You prob don't need to do too many tweaks to the original to make work.

like image 604
domc Avatar asked Dec 07 '22 13:12

domc


1 Answers

You can define an extension like this:

extension String {
    func split(usingRegex pattern: String) -> [String] {
        //### Crashes when you pass invalid `pattern`
        let regex = try! NSRegularExpression(pattern: pattern)
        let matches = regex.matches(in: self, range: NSRange(0..<utf16.count))
        let ranges = [startIndex..<startIndex] + matches.map{Range($0.range, in: self)!} + [endIndex..<endIndex]
        return (0...matches.count).map {String(self[ranges[$0].upperBound..<ranges[$0+1].lowerBound])}
    }
}

let str = "hi|thisZshouldZYbe|separated"
let separator = "\\||ZY?"
let result = str.split(usingRegex: separator)
print(result) //->["hi", "this", "should", "be", "separated"]

The above code does not work as you expect when you use "\\||Z|ZY", but I think you can modify your pattern to fit into this extension.

like image 97
OOPer Avatar answered Mar 23 '23 01:03

OOPer