问题
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.
回答1:
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.
回答2:
My suggestion is to create an UUID string as separator, then replace the occurrences of the regex pattern with this UUID string and split the string.
let string = "hi|thisZshouldZYbe|separated"
let uuid = UUID().uuidString
let result = string.replacingOccurrences(of: "\\||ZY?", with: uuid, options: .regularExpression).components(separatedBy: uuid)
Your pattern works only in another order of the OR parts ("\\||ZY|Z"
)
来源:https://stackoverflow.com/questions/53238251/swift-splitting-strings-with-regex-ignoring-search-string