import Foundation
let pattern = #"^(?!^xn--.*)(?!^.*(\.s3alias|--ol-s3)$)(?!^([0-9]+\.){3}[0-9]+$)(?!.*\.\.+)(^[a-z0-9][a-z0-9\-\.]{1,61}[a-z0-9]$)$"#
let regex = try! NSRegularExpression(pattern: pattern, options: .anchorsMatchLines)
let testString = #"""
// ^(?!^xn--.*)(?!^.*(\.s3alias|--ol-s3)$)(?!^([0-9]+\.){3}[0-9]+$)(?!.*\.\.+)(^[a-z0-9][a-z0-9\-\.]{1,61}[a-z0-9]$)$
// 1. Disallow the xn-- .s3alias and --ol-s3 bans:
// (?!^xn--.*)(?!^.*(\.s3alias|--ol-s3)$)
// 2. Disallow IPv4 address (four segments of 1-3 numbers, separated by dots)
// (?!^([0-9]{1,3}\.){3}[0-9]{1,3}$)
// 4. Disallow consecutive dots
// (?!.*\.\.+)
// 3. must be 3-63 characters, starting and ending with alphanum, and only dots, dashes or lower alphanum
// (^[a-z0-9][a-z0-9\-\.]{1,61}[a-z0-9]$)
//
// Shorter version of this:
// ^(?!(xn--.*|.*(\.s3alias|--ol-s3)$|([0-9]+\.){3}[0-9]+$|.*\.\.+))(^[a-z0-9][a-z0-9\-\.]{1,61}[a-z0-9]$)
//
// Alternative:
// ^(?!^xn--.*)(?!^.*(\.s3alias|--ol-s3)$)(?!^([0-9]+\.){3}[0-9]+$)^[a-z0-9](\.[a-z0-9\-]+|[a-z0-9\-])*(\.|[a-z0-9\-])[a-z0-9]$
// 1. Disallow the xn-- .s3alias and --ol-s3 bans:
// (?!^xn--.*)(?!^.*(\.s3alias|--ol-s3)$)
// 2. Disallow IPv4 address (four segments of 1-3 numbers, separated by dots)
// (?!^([0-9]{1,3}\.){3}[0-9]{1,3}$)
// 3. Must start with alphanum
// ^[a-z0-9]
// 4. Allow only dots, dashes or lower alphanum, and disallow consecutive dots:
// (\.[a-z0-9\-]+|[a-z0-9\-])*
// 5. Must be three or more chars and end in an alphanum:
// (\.|[a-z0-9\-])[a-z0-9]$
//
// fine
a.b.c
asdf
a.b
abc
a-b
a--b
a---------------------b
000
010
1.2.3.a
foo-s3alias
foo--ol-s
xn-a
// too short
a
ab
// no int'l idn looking
xn--asdf
// can't end in these
foo.s3alias
foo--ol-s3
// must start, end in alphanum
abcd.
.abcd
.ab
abc-
acb.b-
// no consecutive dots
a....c
a..c
aaaa.a.a..b
// non-alphanumdash
élan
hello_world
FOO
foO
"""#
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