import Foundation
let pattern = #"(?<=at point, )(X=(?:\d|\.)+) +\K(Y=(?:\d|\.)+).*?\K(value \w+)\R +\K(tag \w+)\K"#
let regex = try! NSRegularExpression(pattern: pattern, options: [.anchorsMatchLines, .dotMatchesLineSeparators])
let testString = #"""
[ AutoCAD - Thu Sep 03 15:59:09 2020 ]----------------------------------------
Command: LIST
Select objects: Specify opposite corner: 468 found
Select objects:
BLOCK REFERENCE Layer: "layer1"
Space: Model space
Handle = 12345
Block Name: "Block"
at point, X=1378.4556 Y=1314.2124 Z= 0.0000
X scale factor: 16.5000
Y scale factor: 16.5000
rotation angle: 160.67
Z scale factor: 266.0000
Scale uniformly: No
Allow exploding: Yes
ATTRIBUTE Layer: "layer1"
Space: Model space
Handle = 12345
Style = "STANDARD"
Annotative: No
Font file = default.shx
substituted by default.shx
start point, X=1365.1222 Y=1319.6510 Z= 0.0000
height 3.0000
value 2999
tag THINGY
rotation angle 340.67
width scale factor 1.0000
obliquing angle 0.00
flags normal
generation normal
BLOCK REFERENCE Layer: "layer1"
Space: Model space
Handle = 12345
Block Name: "Block"
at point, X=1378.4556 Y=1314.2124 Z= 0.0000
X scale factor: 16.5000
Y scale factor: 16.5000
rotation angle: 160.67
Z scale factor: 266.0000
Scale uniformly: No
Allow exploding: Yes
ATTRIBUTE Layer: "layer1"
Space: Model space
Handle = 12345
Style = "STANDARD"
Annotative: No
Font file = default.shx
substituted by default.shx
start point, X=1365.1222 Y=1319.6510 Z= 0.0000
height 3.0000
value 2999
tag THINGY
rotation angle 340.67
width scale factor 1.0000
obliquing angle 0.00
flags normal
generation normal
BLOCK REFERENCE Layer: "layer1"
Space: Model space
Handle = 12345
Block Name: "Block"
at point, X=1378.4556 Y=1314.2124 Z= 0.0000
X scale factor: 16.5000
Y scale factor: 16.5000
rotation angle: 160.67
Z scale factor: 266.0000
Scale uniformly: No
Allow exploding: Yes
ATTRIBUTE Layer: "layer1"
Space: Model space
Handle = 12345
Style = "STANDARD"
Annotative: No
Font file = default.shx
substituted by default.shx
start point, X=1365.1222 Y=1319.6510 Z= 0.0000
height 3.0000
value 2999
tag THINGY
rotation angle 340.67
width scale factor 1.0000
obliquing angle 0.00
flags normal
generation normal
BLOCK REFERENCE Layer: "layer1"
Space: Model space
Handle = 12345
Block Name: "Block"
at point, X=1378.4556 Y=1314.2124 Z= 0.0000
X scale factor: 16.5000
Y scale factor: 16.5000
rotation angle: 160.67
Z scale factor: 266.0000
Scale uniformly: No
Allow exploding: Yes
ATTRIBUTE Layer: "layer1"
Space: Model space
Handle = 12345
Style = "STANDARD"
Annotative: No
Font file = default.shx
substituted by default.shx
start point, X=1365.1222 Y=1319.6510 Z= 0.0000
height 3.0000
value 2999
tag THINGY
rotation angle 340.67
width scale factor 1.0000
obliquing angle 0.00
flags normal
generation normal
BLOCK REFERENCE Layer: "layer1"
Space: Model space
Handle = 12345
Block Name: "Block"
at point, X=1378.4556 Y=1314.2124 Z= 0.0000
X scale factor: 16.5000
Y scale factor: 16.5000
rotation angle: 160.67
Z scale factor: 266.0000
Scale uniformly: No
Allow exploding: Yes
ATTRIBUTE Layer: "layer1"
Space: Model space
Handle = 12345
Style = "STANDARD"
Annotative: No
Font file = default.shx
substituted by default.shx
start point, X=1365.1222 Y=1319.6510 Z= 0.0000
height 3.0000
value 2999
tag THINGY
rotation angle 340.67
width scale factor 1.0000
obliquing angle 0.00
flags normal
generation normal
BLOCK REFERENCE Layer: "layer1"
Space: Model space
Handle = 12345
Block Name: "Block"
at point, X=1378.4556 Y=1314.2124 Z= 0.0000
X scale factor: 16.5000
Y scale factor: 16.5000
rotation angle: 160.67
Z scale factor: 266.0000
Scale uniformly: No
Allow exploding: Yes
ATTRIBUTE Layer: "layer1"
Space: Model space
Handle = 12345
Style = "STANDARD"
Annotative: No
Font file = default.shx
substituted by default.shx
start point, X=1365.1222 Y=1319.6510 Z= 0.0000
height 3.0000
value 2999
tag THINGY
rotation angle 340.67
width scale factor 1.0000
obliquing angle 0.00
flags normal
generation normal
"""#
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