import Foundation
let pattern = ##"^(?:(52\-)|(1\-))?(\()?(?(1)[0-9]{2,3}|[2-9][0-9]{2})(?(3)\)\s?|(\-|[.]|\s|))(?(1)[0-9]|[2-9])[0-9]{2}(?(4)\4|(?:\-|[.]|\s)?)[0-9]{4}(\s?(?:x|ext|ext.|extension|Ext|Ext.|Extension|#)\s?[0-9]+)?$"##
let regex = try! NSRegularExpression(pattern: pattern, options: .anchorsMatchLines)
let testString = ##"""
Regular valid formats
225-586-7777
(223)249-4444
(223) 234-3344
223.456.2222
2253451111
223 334 4444
1-325-586-7777
1-(923)249-4444
1-(923) 234-3344
1-923.456.2222
1-9253451111
1-923 234 4444
52-125-586-7777
52-(123)249-4444
52-(123) 234-3344
52-123.456.2222
52-1253451111
52-123 134 4444
Valid formats with extensions
1-800-661-3696 x14700
1-800-661-3696x14700
1-800-661-3696 Extension 14700
1-800-661-3696 ext14700
325-586-7777 x123
(323)249-4444x123
(323) 234-3344 Ext 123
323.456.2222 ext 124
3253451111ext. 123
323 334 4444extension234
(223)456 7891 x 123
(223)456 7891 ext 123
(223)456 7891 ext. 123
(223)456 7891 Ext 123
(223)456 7891 Ext. 123
(910)456-8970 x12
(910)456-8970 #12
(910)456-8970 extension12456
(910)456-8970 Extension 12456
Invalid formats
444000-1111
444-0001111
444.000-1111
444000 1111
444 0001111
444 000.1111
444.0001111
444000.1111
444-000.1111
(4440001111
444)0001111
440001111
444000111111
125-586-7777
(123)249-4444
(123) 234-3344
123.456.2222
1253451111
123 134 4444
125-586-7777
(123)249-4444
(123) 234-3344
123.456.2222
1253451111
123 134 4444
Invalid formats with extensions
12-125-586-7777
12-(123)249-4444
12-(123) 234-3344
12-123.456.2222
12-1253451111
12-123 134 4444
12-444000-1111
12-444-0001111
12-444.000-1111
12-444000 1111
12-444 0001111
12-444 000.1111
12-444.0001111
12-444000.1111
12-444-000.1111
12-(4440001111
12-444)0001111
12-440001111
12-444000111111
1-888-720-1275 x2 x2
1-888-720-1275 2
1-888-720-1275 x
1-888-720-1275 Ext
888-720-1275x
1-444000-1111
1-444-0001111
1-444.000-1111
1-444000 1111
1-444 0001111
1-444 000.1111
1-444.0001111
1-444000.1111
1-444-000.1111
1-(4440001111
1-444)0001111
1-440001111
1-444000111111
"""##
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