import Foundation
let pattern = ##"([a-z0-9-]+\:\/+)([^\/\s]+)([a-z0-9\-@\^=%&;\/~\+]*)[\?]?([^ \#\r\n]*)#?([^ \#\r\n]*)"##
let regex = try! NSRegularExpression(pattern: pattern, options: .caseInsensitive)
let testString = ##"""
Bob: Hey there, have you checked https://www.facebook.com ?
(ignore) https://github.com/justsml?tab=activity#top (ignore this too)
smb:///winbox/dfs/ - ipp://printer
a a:// . Bob: Hey there, have you checked https://www.facebook.com ?
(ignore) https://github.com/justsml?tab=activity#top (ignore this too)
smb:///winbox/dfs/ - ipp://printer
a a:// .
chrome-extension://flags
ms-help://good-luck.html
iris.beep://really/dots // <- Matching period and dash chars at **only the beginning** of the string is difficult (unless we can anchor the beginning of line w/ ^) & would make the regex over 100 chars in length.
s3://buckets-o-fun
pkcs11://because-pkcs7-is-shit
.iris.beep://really/dots
"""##
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