import Foundation
let pattern = #"""
(?(DEFINE)
(?<WebAddress> (?&Protocol){0,}(?&Host)(?:\:(?&Port)){0,1}(?&Path){0,1})(?=\s|$)
(?<Protocol> \w{2,}\:\/\/)
(?<Host> (?&NameParts)(?&Suffix))
(?<NameParts> (\w{2,}\.){1,})
(?<Suffix> (\w{2,}))
(?<Port> (\d{1,5}))
(?<Path> (\/\S{1,}))
)
((?&WebAddress))
"""#
let regex = try! NSRegularExpression(pattern: pattern, options: [.anchorsMatchLines, .allowCommentsAndWhitespace])
let testString = #"""
http://asdf.com
http://www.google.com:80/path?asdf-asdf=adsfddk@ffs
http://asdf.com
https://adfdfffdfds.edu
asd.edu:8383
jjhgf.net:21
https://uno.mbsc.asdf.com:1233
google.com
mbsc.unomaha.edu
ftp.unomaha.edu
asdf.com
ftp.dd.dfffffdfdfdfdfdfdfdfdfdfdf
sdf.com
abc.def.com
https://msn.sdf.com:123
http://asd.com
ftp://ftp.mbsc.unomaha.edu:81813
http://www.mbsc.unomaha.edu
https://www.mbsc.unomaha.edu:1231/path?docid=-123
weather.tv
www.google.com
google.com/asdf?coxd
"""#
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