import Foundation
let pattern = ##"(https?://[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}[-a-zA-Z0-9()@:%_+.~#?&/=]*/?([-a-zA-Z0-9()@%_+~#?&/=]|\b))"##
let regex = try! NSRegularExpression(pattern: pattern, options: .anchorsMatchLines)
let testString = ##"""
Check https://example.com/path?param=value.with.dots for configuration.
Check https://example.com/path?param=value.with.dots.
Check https://example.com/path?param=value.with.dots. Or else.
Visit https://example.com for more information.
Check out https://github.com/user/repo, it's really good.
The API endpoint is https://api.service.com/v1/data; use it carefully.
Go to https://example.com: it has everything you need.
See https://docs.example.com? It explains the process.
Try https://example.com! It's amazing.
The site (https://example.com) is down for maintenance.
Links like https://example.com are common in emails.
Visit https://example.com/path/file.pdf and download it.
The URL https://example.com/api?key=123 returns JSON data.
Check https://example.com, https://test.org, and https://demo.net.
Go to https://example.com... wait, that's the wrong link.
The website https://example.com-- actually, never mind.
Visit https://example.com/path?q=value&r=2 for the search results.
See https://example.com/file.html, then click the button.
The documentation at https://docs.example.com; section 4.2 explains it.
Try https://example.com:8080/api/v1/users for user data.
Links: https://example.com, https://test.org; both are useful.
Go to https://example.com/path/to/resource, download the file.
The URL https://example.com/path#section contains the answer.
Visit https://example.com/very/long/path/here for details.
Check https://sub.domain.example.com for subdomain content.
The site https://example.com/path.with.dots has interesting content.
Go to https://example.com/path-with-dashes?, it's well organized.
See https://example.com/path_with_underscores for more info.
The endpoint https://api.example.com/v2/data?format=json returns data.
Visit https://example.com/file.tar.gz to download the archive.
The URL https://192.168.1.1:8080 is for local testing.
Go to https://example.com/path/ (note the trailing slash).
"""##
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