import Foundation
let pattern = #"(.+)(?:[Ss _\.](\d{2,})[Ee _\.](\d{2,}))[\. _](\d{3,4}p)?(.+)?.*?\-(.+?)(?:\[(.+)\])?\.(\w+)"#
let regex = try! NSRegularExpression(pattern: pattern)
let testString = #"""
Ridiculousness.S07E15.HDTV.x264-TASTETV[eztv].mp4
Portlandia.S06E03.HDTV.x264-KILLERS[eztv].mp4
Life.in.Pieces.S01E15.HDTV.x264-KILLERS[eztv].mp4
Portlandia.S06E03.720p.HDTV.x264-KILLERS[eztv].mkv
Idiotsitter.S01E04.HDTV.x264-KILLERS[eztv].mp4
Lip.Sync.Battle.S02E05.720p.HDTV.x264-ALTEREGO[eztv].mkv
Lip.Sync.Battle.S02E05.HDTV.x264-ALTEREGO[eztv].mp4
Shades.of.Blue.S01E05.720p.HDTV.x264-AVS[eztv].mkv
Shades.of.Blue.S01E05.720p.HDTV.x264-FLEET[eztv].mkv
Colony.S01E04.720p.HDTV.x264-KILLERS[eztv].mkv
Shades.of.Blue.S01E05.HDTV.x264-FLEET[eztv].mp4
Baskets.S01E03.INTERNAL.720p.HDTV.x264-KILLERS[eztv].mkv
Baskets.S01E03.INTERNAL.HDTV.x264-KILLERS[eztv].mp4
Workaholics.S06E04.720p.HDTV.x264-KILLERS[eztv].mkv
Baskets.S01E03.HDTV.x264-FLEET[eztv].mp4
Baskets.S01E03.720p.HDTV.x264-FLEET[eztv].mkv
The.Blacklist.S03E13.720p.HDTV.x264-AVS[eztv].mkv
The.100.S03E03.720p.HDTV.x264-AVS[eztv].mkv
Angel.From.Hell.S01E05.HDTV.x264-LOL[eztv].mp4
Angel.From.Hell.S01E05.720p.HDTV.X264-DIMENSION[eztv].mkv
The.100.S03E03.HDTV.x264-FLEET[eztv].mp4
Mom.S03E10.HDTV.x264-LOL[eztv].mp4
Mom.S03E10.720p.HDTV.X264-DIMENSION[eztv].mkv
Life.in.Pieces.S01E15.720p.HDTV.x264-AVS[eztv].mkv
Elementary.S04E11.HDTV.x264-LOL[eztv].mp4
Elementary.S04E11.720p.HDTV.X264-DIMENSION[eztv].mkv
DCs.Legends.of.Tomorrow.S01E03.HDTV.x264-LOL[eztv].mp4
The.Vampire.Diaries.S07E11.HDTV.x264-LOL[eztv].mp4
DCs.Legends.of.Tomorrow.S01E03.720p.HDTV.X264-DIMENSION[eztv].mkv
The.Vampire.Diaries.S07E11.720p.HDTV.X264-DIMENSION[eztv].mkv
Saving.Hope.S04E16.HDTV.x264-BAJSKORV[eztv].mp4
Saving.Hope.S04E16.720p.HDTV.x264-BAJSKORV[eztv].mkv
The.Big.Bang.Theory.S09E14.HDTV.x264-LOL[eztv].mp4
The.Ellen.DeGeneres.Show.2016.02.04.HDTV.x264-ALTEREGO[eztv].mp4
The.Ellen.DeGeneres.Show.2016.02.04.720p.HDTV.x264-ALTEREGO[eztv].mkv
Teachers.2016.S01E04.REPACK.720p.HDTV.x264-ALTEREGO[eztv].mkv
Celebrity.Big.Brothers.Bit.On.The.Side.S10E24.720p.HDTV.x264-C4TV[eztv].mkv
Long.Island.Medium.S07E03.HDTV.x264-CRiMSON[eztv].mp4
Celebrity.Big.Brothers.Bit.On.The.Side.S10E24.HDTV.x264-C4TV[eztv].mp4
Clarence.US.S02E06.Time.Crimes.720p.HDTV.x264-W4F[eztv].mkv
Clarence.US.S02E06.Time.Crimes.HDTV.x264-W4F[eztv].mp4
Clarence.US.S02E05.Ren.Faire.720p.HDTV.x264-W4F[eztv].mkv
Clarence.US.S02E05.Ren.Faire.HDTV.x264-W4F[eztv].mp4
Great.British.Railway.Journeys.Series.7.05of20.Ashley.to.Alton.720p.x264.HDTV[eztv].mp4
Celebrity.Big.Brother.S17E35.HDTV.x264-C4TV[eztv].mp4
James.Corden.2016.02.03.Rosie.ODonnell.HDTV.x264-TASTETV[eztv].mp4
James.Corden.2016.02.03.Rosie.ODonnell.720p.HDTV.x264-TASTETV[eztv].mkv
Mr Robot S01E10 2015 HDTV x264 - SPARKS.wmv
"""#
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