import Foundation
let pattern = ##"(?im)^(?=.{1,64}@)(?:("[^"\\]*(?:\\.[^"\\]*)*"@)|((?:[0-9a-z](?:\.(?!\.)|[-!#\$%&'\*\+\/=\?\^`\{\}\|~\w])*)?[0-9a-z]@))(?=.{1,255}$)(?:(\[(?:\d{1,3}\.){3}\d{1,3}\])|((?:(?=.{1,63}\.)[0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9][\-a-z0-9]{0,22}[a-z0-9])|((?=.{1,63}$)[0-9a-z][-\w]*))$"##
let regex = try! NSRegularExpression(pattern: pattern)
let testString = ##"""
// Mix valid/invalid
david.jones@proseware.com
d.j@server1.proseware.com
jones@ms1.proseware.com
j.@server1.proseware.com
j@proseware.com9
js#internal@proseware.com
j_9@[129.126.118.1]
j..s@proseware.com
js*@proseware.com
js@proseware..com
js@proseware.com9
j.s@server1.proseware.com
"j\"s\""@proseware.com
js@contoso.中国.com
=========================================
// Valid
simple@example.com
very.common@example.com
disposable.style.email.with+symbol@example.com
other.email-with-hyphen@example.com
fully-qualified-domain@example.com
user.name+tag+sorting@example.com
fully-qualified-domain@example.com
x@example.com
carlosd'intino@arnet.com.ar
example-indeed@strange-example.com
admin@mailserver1
example@s.example
" "@example.org
"john..doe"@example.org
// Invalid
Abc.example.com
A@b@c@example.com
a\"b(c)d,e:f;g<h>i[j\\k]l@example.com
just\"not\"right@example.com
this is\"not\\allowed@example.com
this\\ still\"not\\allowed@example.com
1234567890123456789012345678901234567890123456789012345678901234+x@example.com
john..doe@example.com
john.doe@example..com
"""##
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