Swift Get string between 2 strings in a string
extension String { func slice(from: String, to: String) -> String? { return (range(of: from)?.upperBound).flatMap { substringFrom in (range(of: to, range: substringFrom..<endIndex)?.lowerBound).map { substringTo in String(self[substringFrom..<substringTo]) } } }}"javascript:getInfo(1,'Info/99/something', 'City Hall',1, 99);" .sliceFrom("'", to: "',")
I'd use a regular expression to extract substrings from complex input like this.
Swift 3.1:
let test = "javascript:getInfo(1,'Info/99/something', 'City Hall',1, 99);"if let match = test.range(of: "(?<=')[^']+", options: .regularExpression) { print(test.substring(with: match))}// Prints: Info/99/something
Swift 2.0:
let test = "javascript:getInfo(1,'Info/99/something', 'City Hall',1, 99);"if let match = test.rangeOfString("(?<=')[^']+", options: .RegularExpressionSearch) { print(test.substringWithRange(match))}// Prints: Info/99/something
I rewrote one of the top Swift answers to understand what it was doing with map
. I prefer a version using guard
, IMO.
extension String { func slice(from: String, to: String) -> String? { guard let rangeFrom = range(of: from)?.upperBound else { return nil } guard let rangeTo = self[rangeFrom...].range(of: to)?.lowerBound else { return nil } return String(self[rangeFrom..<rangeTo]) } }let test1 = "a[b]c".slice(from: "[", to: "]") // "b"let test2 = "abc".slice(from: "[", to: "]") // nillet test3 = "a]b[c".slice(from: "[", to: "]") // nillet test4 = "[a[b]c]".slice(from: "[", to: "]") // "a[b"