Reputation: 1193
I am splitting a string into array at new line. The text comes from a server and can be created on multiple platforms. Have no issues with Unix text, however because of the new line definition issues (\n\r vs \n), the text is not split if it is sent from Windows-based server.
I am using this to find a regex expression for a new line and replace it with \n:
let stringRev = self.string.stringByReplacingOccurrencesOfString( "(\r\n|\r|\n)", withString: "\n", options: NSStringCompareOptions.RegularExpressionSearch, range: nil)
let myArray = stringRev.componentsSeparatedByString("\n")
Is there a way to do it in Swift?
Many thanks!
Upvotes: 1
Views: 2788
Reputation: 236340
You can use String method enumerateLines:
let input = "Line 1\r\nLine 2\r\nLine3"
var result:[String] = []
input.enumerateLines { (line, _) -> () in
result.append(line)
}
print(result) // "["Line 1", "Line 2", "Line3"]\n
You can also use componentsSeparatedByCharactersInSet and use NSCharacterSet.newlineCharacterSet() to break up your lines
let input = "Line 1\rLine 2\rLine3"
let linesArray = input.componentsSeparatedByCharactersInSet(.newlineCharacterSet())
linesArray // ["Line 1", "Line 2", "Line3"]
If you are planning to use it somewhere else in your code you can create an extension:
extension String {
var linesArray:[String] {
var result:[String] = []
enumerateLines { (line, _) -> () in
result.append(line)
}
return result
}
var lines: [String] {
return componentsSeparatedByCharactersInSet(NSCharacterSet.newlineCharacterSet())
}
}
let input = "Line 1\nLine 2\nLine3"
let allLinesSample = input.linesArray // ["Line 1", "Line 2", "Line3"]
let input2 = "Line 1\r\nLine 2\r\nLine3"
let allLinesSample2 = input2.linesArray // ["Line 1", "Line 2", "Line3"]
let input3 = "Line 1\rLine 2\rLine3"
let allLinesSample3 = input3.lines // ["Line 1", "Line 2", "Line3"]
Upvotes: 4