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 = #"^/foo/bar/+(?:(?:find|count)/*$(*SKIP)(*FAIL)|([^/\r\n\t]+))/*$"#
let regex = try! NSRegularExpression(pattern: pattern, options: .anchorsMatchLines)
let testString = #"""
--------------------must NOT get as id (reseved key words)
/foo/bar/count
/foo/bar/find
--------------------must NOT get as id (not present)
/foo/bar/
--------------------must NOT get as id (not present tab test)
/foo/bar/
--------------------must NOT get as id (not present line break test)
/foo/bar/
--------------------must NOT get as id (not present tab, line break, multiple slashes test)
/foo/bar// /
/
//
--------------------must get as id
/foo/bar/1
/foo/bar/1c
/foo/bar/c1
/foo/bar/sku
/foo/bar/countfind
/foo/bar/findcount
/foo/bar/skucount
/foo/bar/skufind
/foo/bar/countsku
/foo/bar/findsku
/foo/bar/coun
/foo/bar/fin
/foo/bar/ount
/foo/bar/ind
/foo/bar/skucoun
/foo/bar/skufin
/foo/bar/finsku
/foo/bar/counsku
--------------------must get as id (unnecessary slash test)
/foo/bar/1/
/foo/bar/1c/
/foo/bar/c1/
/foo/bar/sku/
/foo/bar/countfind/
/foo/bar/findcount/
/foo/bar/skucount/
/foo/bar/skufind/
/foo/bar/countsku/
/foo/bar/findsku/
/foo/bar/coun/
/foo/bar/fin/
/foo/bar/ount/
/foo/bar/ind/
/foo/bar/skucoun/
/foo/bar/skufin/
/foo/bar/finsku/
/foo/bar/counsku/
--------------------must get as id (unnecessary|invalid slashed test)
/foo/bar///1///
/foo/bar///1c///
/foo/bar///c1///
/foo/bar///sku///
/foo/bar///countfind///
/foo/bar///findcount///
/foo/bar///skucount///
/foo/bar///skufind///
/foo/bar///countsku///
/foo/bar///findsku///
/foo/bar///coun///
/foo/bar///fin///
/foo/bar///ount///
/foo/bar///ind///
/foo/bar///skucoun///
/foo/bar///skufin///
/foo/bar///finsku///
/foo/bar///counsku///
"""#
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