import Foundation
let pattern = #"^(0|[1-9]+[0-9]*) (@[^@]+@ |)([A-Za-z0-9_]+)( [^\n\r]*|)$"#
let regex = try! NSRegularExpression(pattern: pattern, options: .anchorsMatchLines)
let testString = #"""
0 @N1@ NOTE Lorem ipsum dolor sit amet
0 HEAD
1 SOUR FTM
2 VERS 22.2.6.950
1 DEST FTM
1 DATE 31 MAR 2017
1 CHAR UTF-8
3 _LINK http://www.facebook.com/1247584965
2 SOUR @S122@
3 PAGE Facebook update - David Hatch - 6/5/2013
3 _LINK http://www.facebook.com/1247584965
1 RESI
2 DATE BET 1935 AND 1993
2 PLAC San Francisco, California, USA
1 RESI
2 DATE 1994
2 PLAC San Francisco, California, USA
2 SOUR @S605@
3 DATA
4 TEXT Birth date: 20 Sep 1966 Birth place: Residence date: 1994
5 CONC Residence place: San Francisco, CA
1 RESI 106 Oakcrest Rd
2 DATE 26 MAR 2017
2 PLAC San Anselmo, Marin, California, USA
1 FAMS @F500@
1 FAMC @F656@
0 @I923@ INDI
1 NAME Vincent /Crilley/
1 SEX M
1 FAMS @F254@
0 @I5899@ INDI
1 NAME Marjorie Edna /Footitt/
2 SOUR @S506@
2 SOUR @S176@
2 SOUR @S168@
2 SOUR @S624@
3 DATA
4 TEXT Residence date: Residence place: USA
2 SOUR @S115@
3 PAGE Year: 1940; Census Place: St Paul, Ramsey, Minnesota; Roll: T627_1996;
4 CONC Page: 11A; Enumeration District: 90-73.
3 DATA
4 _TEXT Birth date: abt 1918 Birth place: North Dakota Residence date: 1
5 CONC Apr 1940 Residence place: St Paul, Ramsey, Minnesota, United States
2 SOUR @S607@
3 PAGE Year: 1920; Census Place: Carrington, Foster, North Dakota; Roll:
4 CONC T625_1334; Page: 13B; Enumeration District: 117; Image: .
3 DATA
"""#
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