import Foundation
let pattern = ####"""
(?m)
^
(?=
(?:
(?:
(?(1) (?!) )
( . ) # (1)
| (?(2) (?!) )
(?! \1 )
( . ) # (2)
| (?(3) (?!) )
(?! \1 | \2 )
( . ) # (3)
| (?(4) (?!) )
(?! \1 | \2 | \3 )
( . ) # (4)
| (?(5) (?!) )
(?! \1 | \2 | \3 | \4 )
( . ) # (5)
| (?(6) (?!) )
(?! \1 | \2 | \3 | \4 | \5 )
( . ) # (6)
| (?(7) (?!) )
(?! \1 | \2 | \3 | \4 | \5 | \6 )
( . ) # (7)
| (?(8) (?!) )
(?! \1 | \2 | \3 | \4 | \5 | \6 | \7 )
( . ) # (8)
| (?(9) (?!) )
(?! \1 | \2 | \3 | \4 | \5 | \6 | \7 | \8 )
( . ) # (9)
)
\S*?
){1,9}
$
)
(?= (?: \1|\2|\3|\4|\5|\6|\7|\8|\9 )* $ )
(?(DEFINE)
(?<one> # (8)
(?: (?! \1 ) . )*
\1
)
(?<two> # (9)
(?: (?! \2 ) . )*
\2
)
(?<three> # (10)
(?: (?! \3 ) . )*
\3
)
(?<four> # (11)
(?: (?! \4 ) . )*
\4
)
(?<five> # (12)
(?: (?! \5 ) . )*
\5
)
(?<six> # (13)
(?: (?! \6 ) . )*
\6
)
(?<seven> # (14)
(?: (?! \7 ) . )*
\7
)
(?<eight> # (15)
(?: (?! \8 ) . )*
\8
)
(?<nine> # (16)
(?: (?! \9 ) . )*
\9
)
)
(?: ### Times Table 9 x 9 = 81 max char string
# 1
(?(1) (?= (?&one) {1} (?! .* \1 ))
(?(2) (?= (?&two) {1} (?! .* \2 ))
(?(3) (?= (?&three){1} (?! .* \3 ))
(?(4) (?= (?&four) {1} (?! .* \4 ))
(?(5) (?= (?&five) {1} (?! .* \5 ))
(?(6) (?= (?&six) {1} (?! .* \6 ))
(?(7) (?= (?&seven){1} (?! .* \7 ))
(?(8) (?= (?&eight){1} (?! .* \8 ))
(?(9) (?= (?&nine) {1} (?! .* \9 ))
)))))))))
| # 2
(?(1) (?= (?&one) {2} (?! .* \1 ))
(?(2) (?= (?&two) {2} (?! .* \2 ))
(?(3) (?= (?&three){2} (?! .* \3 ))
(?(4) (?= (?&four) {2} (?! .* \4 ))
(?(5) (?= (?&five) {2} (?! .* \5 ))
(?(6) (?= (?&six) {2} (?! .* \6 ))
(?(7) (?= (?&seven){2} (?! .* \7 ))
(?(8) (?= (?&eight){2} (?! .* \8 ))
(?(9) (?= (?&nine) {2} (?! .* \9 ))
)))))))))
| # 3
(?(1) (?= (?&one) {3} (?! .* \1 ))
(?(2) (?= (?&two) {3} (?! .* \2 ))
(?(3) (?= (?&three){3} (?! .* \3 ))
(?(4) (?= (?&four) {3} (?! .* \4 ))
(?(5) (?= (?&five) {3} (?! .* \5 ))
(?(6) (?= (?&six) {3} (?! .* \6 ))
(?(7) (?= (?&seven){3} (?! .* \7 ))
(?(8) (?= (?&eight){3} (?! .* \8 ))
(?(9) (?= (?&nine) {3} (?! .* \9 ))
)))))))))
| # 4
(?(1) (?= (?&one) {4} (?! .* \1 ))
(?(2) (?= (?&two) {4} (?! .* \2 ))
(?(3) (?= (?&three){4} (?! .* \3 ))
(?(4) (?= (?&four) {4} (?! .* \4 ))
(?(5) (?= (?&five) {4} (?! .* \5 ))
(?(6) (?= (?&six) {4} (?! .* \6 ))
(?(7) (?= (?&seven){4} (?! .* \7 ))
(?(8) (?= (?&eight){4} (?! .* \8 ))
(?(9) (?= (?&nine) {4} (?! .* \9 ))
)))))))))
| # 5
(?(1) (?= (?&one) {5} (?! .* \1 ))
(?(2) (?= (?&two) {5} (?! .* \2 ))
(?(3) (?= (?&three){5} (?! .* \3 ))
(?(4) (?= (?&four) {5} (?! .* \4 ))
(?(5) (?= (?&five) {5} (?! .* \5 ))
(?(6) (?= (?&six) {5} (?! .* \6 ))
(?(7) (?= (?&seven){5} (?! .* \7 ))
(?(8) (?= (?&eight){5} (?! .* \8 ))
(?(9) (?= (?&nine) {5} (?! .* \9 ))
)))))))))
| # 6
(?(1) (?= (?&one) {6} (?! .* \1 ))
(?(2) (?= (?&two) {6} (?! .* \2 ))
(?(3) (?= (?&three){6} (?! .* \3 ))
(?(4) (?= (?&four) {6} (?! .* \4 ))
(?(5) (?= (?&five) {6} (?! .* \5 ))
(?(6) (?= (?&six) {6} (?! .* \6 ))
(?(7) (?= (?&seven){6} (?! .* \7 ))
(?(8) (?= (?&eight){6} (?! .* \8 ))
(?(9) (?= (?&nine) {6} (?! .* \9 ))
)))))))))
| # 7
(?(1) (?= (?&one) {7} (?! .* \1 ))
(?(2) (?= (?&two) {7} (?! .* \2 ))
(?(3) (?= (?&three){7} (?! .* \3 ))
(?(4) (?= (?&four) {7} (?! .* \4 ))
(?(5) (?= (?&five) {7} (?! .* \5 ))
(?(6) (?= (?&six) {7} (?! .* \6 ))
(?(7) (?= (?&seven){7} (?! .* \7 ))
(?(8) (?= (?&eight){7} (?! .* \8 ))
(?(9) (?= (?&nine) {7} (?! .* \9 ))
)))))))))
| # 8
(?(1) (?= (?&one) {8} (?! .* \1 ))
(?(2) (?= (?&two) {8} (?! .* \2 ))
(?(3) (?= (?&three){8} (?! .* \3 ))
(?(4) (?= (?&four) {8} (?! .* \4 ))
(?(5) (?= (?&five) {8} (?! .* \5 ))
(?(6) (?= (?&six) {8} (?! .* \6 ))
(?(7) (?= (?&seven){8} (?! .* \7 ))
(?(8) (?= (?&eight){8} (?! .* \8 ))
(?(9) (?= (?&nine) {8} (?! .* \9 ))
)))))))))
| # 9
(?(1) (?= (?&one) {9} (?! .* \1 ))
(?(2) (?= (?&two) {9} (?! .* \2 ))
(?(3) (?= (?&three){9} (?! .* \3 ))
(?(4) (?= (?&four) {9} (?! .* \4 ))
(?(5) (?= (?&five) {9} (?! .* \5 ))
(?(6) (?= (?&six) {9} (?! .* \6 ))
(?(7) (?= (?&seven){9} (?! .* \7 ))
(?(8) (?= (?&eight){9} (?! .* \8 ))
(?(9) (?= (?&nine) {9} (?! .* \9 ))
)))))))))
)
.*
"""####
let regex = try! NSRegularExpression(pattern: pattern, options: [.anchorsMatchLines, .allowCommentsAndWhitespace])
let testString = #"""
------------------------------
match_words =
------------------------------
arraigning
nonordered
abadbacdcacbdbdc
mesosome
ananna
unendued
tromometer
caucasus
intestines
i
deed
horseshoer
happenchance
reappear
deeded
pullup
arraigning
testes
mononymy
scintillescent
couscous
------------------------------
not_match_words =
------------------------------
edified
unreverberating
underpass
interinsert
pilfered
nippiness
gregarinian
deicide
nonaristocratic
rototiller
ozonizing
museums
backbreaker
interradiated
antistalling
naturalize
equitriangular
reparticipate
ppd
miasmas
cabbage
"""#
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