import Foundation
// WARNING: You included a flag that Swift doesn't support: u
// When this flag is set, it makes the pattern and subject strings to be treated as unicode.
// Swift already treats the pattern and subject strings as unicode by default, so including this flag is redundant.
let pattern = ##"([-\.\w]+:\/{2,3})(?!.*[.]{2})(?![-.*\.])((?!.*@\.)[-_\w@^=%&:;~+\.]+(?<![-\.]))(\/[-_\w@^=%&:;/~+\.]+(?<!\.))?\??([-_\w=&@$!|~+]+)*#?([-_\w=&@$!|~+]+)*"##
let regex = try! NSRegularExpression(pattern: pattern, options: [.anchorsMatchLines, .caseInsensitive])
let testString = ##"""
DB_URL=postgresql://postgres:postgres@localhost/postgres?timeout=0
# Damn, Daniel!
Bob: have you checked https://www.facebook.com?
lorem https://github.com/justsml?tab=activity#top ipsum
smb:///winbox/dfs/ - ipp://printer
leading text chrome-extension://flags??#
s3://buckets/for/all?true=true
s3:///////buckets-o-fun
pkcs11://because-pkcs7-is-weak#only=hash
\||@@https://www.google.com <- should match when extracting
https://we - this is valid
s3://buckets-o-fun/!hi/raw=val&#keep=hashin'?
http://aaa.com.co.com:8080/test?dan=dev#den
hi. pkcs11://because-pkcs7-is-weak
hi. a://b/c?d=e#f=g && a://b/c?d]
hi. chrome-extension://flags hi.
hi. ms-help://good-luck/index.html hi.
hi. .iris.beep://really/dots. hi.
hi. iris.beep://really/dots?test=qs hi.
---
a://b]/c - Should match `a://b` - it's smallest match.
http://www.c:ool.com.au - this one's tricky, should match auth URIs: proto://user:pass@host. Including cases where the password could be omitted (`proto://user@host`.)
boop://really-/ -- technically domains shouldn't end in dashes or other 'special' chars, but this is technically a valid URI.
---
a://b./c?d. -- bad dns, trailing dot: tricky w/o look-arounds. (Adding an OR pattern would muddle the returned data indexes.) -- should match `a://b`
Invalid Examples:
https://www...google...com
https://we@.com
https://asdas-.com
http://-apple-.com
a://(b/c
chrome-extension)://flags
ms-help://|good-luck.html
. , ; : ) ] }
"""##
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