import Foundation
let pattern = #"(?P<street>\d+\s.*?(?:,\s*\w*\s*\d+)*),\s*(?P<city>.*?),\s*(?P<state>[A-Za-z]+)\s*(?P<zip>\d+)?,*"#
let regex = try! NSRegularExpression(pattern: pattern, options: .anchorsMatchLines)
let testString = #"""
9320 Se Woodstock Blvd, Portland, OR 97266
921 S E Powell Blvd, PORTLAND, OR 97202
6560 Sw Beaverton, Raleigh Hills, OR 97225
2875 Se Powell Blvd, Portland, Or 97202, Usa
1311 Nw 23rd Ave, Portland, OR 97210
7710 Sw Barbur Blvd, Portland, OR 97219
1462 Ne 122nd Ave., Portland, OR 97230
1831 W Burnside, PORTLAND, OR 97209
1881 Sw 5th Ave, Portland, OR 97201
3610 Se Hawthorne Blvd, Portland, OR 97214
1850 Sw Skyline Blvd., Portland, OR 97221
9 Centerpointe Dr, Lake Oswego, OR 97035
7700 Southwest Dartmouth Avenue, 120, Tigard, OR 97223
4811 Meadows Road , Suite 111, Lake Oswego, OR 97035
"""#
let stringRange = NSRange(location: 0, length: testString.utf16.count)
let matches = regex.matches(in: testString, range: stringRange)
var result: [[String]] = []
for match in matches {
var groups: [String] = []
for rangeIndex in 1 ..< match.numberOfRanges {
let nsRange = match.range(at: rangeIndex)
guard !NSEqualRanges(nsRange, NSMakeRange(NSNotFound, 0)) else { continue }
let string = (testString as NSString).substring(with: nsRange)
groups.append(string)
}
if !groups.isEmpty {
result.append(groups)
}
}
print(result)
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Swift 5.2, please visit: https://developer.apple.com/documentation/foundation/nsregularexpression