import Foundation
let pattern = ##"#(\d+)\s*=\s*([a-zA-Z0-9]+)\s*\((.*\s*\S*)\);"##
let regex = try! NSRegularExpression(pattern: pattern, options: .caseInsensitive)
let testString = ##"""
#1=IFCOWNERHISTORY(#89024,#44585,$,.NOCHANGE.,$,$,$,1190720890);
#2=IFCSPACE('3YQLb9Ev54MBIbtTd8JFin',#1,'0001',$,$,#88513,#78663,'DesignGross_Floor_2',.ELEMENT.,.INTERNAL.,$);
#3=IFCSLAB('2DGdC704bA7vMD4RPklWqS',#1,'S01','',$,#28410,#77505,$,.FLOOR.);
#4=IFCCONNECTIONSURFACEGEOMETRY(#83383,$);
#5=IFCCONNECTIONSURFACEGEOMETRY(#84374,$);
#6=IFCGEOMETRICREPRESENTATIONCONTEXT('Plan','Model',3,1.0E-5,#17,#18276);
#7=IFCGEOMETRICREPRESENTATIONCONTEXT('Plan','Design',3,1.0E-5,#17,#18276);
#8=IFCCARTESIANPOINT((0.0,0.0,0.0));
#9=IFCDIRECTION((0.0,0.0,1.0));
#10=IFCDIRECTION((1.0,0.0,0.0));
#11=IFCCARTESIANPOINT((0.0,0.0));
#12=IFCDIRECTION((0.0,1.0,0.0));
#13=IFCMATERIAL('Column A');
#14=IFCEXTRUDEDAREASOLID(#28326,#17,#9,3657.6);
#15=IFCCARTESIANPOINT((0.0,3048.0,0.0));
#16=IFCLOCALPLACEMENT(#4428,#17);
#17=IFCAXIS2PLACEMENT3D(#8,#9,#10);
#18=IFCPROPERTYSINGLEVALUE('IsExterior',$,IFCBOOLEAN(.T.),$);
#19=IFCDIRECTION((-1.0,0.0,0.0));
#20=IFCDIRECTION((0.0,-1.0,0.0));
"""##
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