import Foundation
let pattern = #"^([A-z]+)(?: *= *)(\d+|[A-z]+)$"#
let regex = try! NSRegularExpression(pattern: pattern, options: .anchorsMatchLines)
let testString = #"""
Expression validator
^((?:[A-z]+)|((-|\+)?\d+))( +(\++|-+) +((?:-?\d+)|(?:[A-z]+)))*$
Assignment validator
^([A-z]+)(?: *= *)(\d+|[A-z]+)$
c= a
8
8 + 4
-2 + 4 - 5 + 6
9 +++ - 10 -- 8
9 --- + 10
9 --- -10
9 +++ -10 -- 8
3 --- 5
14 - 12
-3 2
name = 44
a = 5
capName = 6 + 4
capName = 6
n = 3
m=4
a = 5
b = a
v= 7
n =9
c= a
A variable can have a name consisting of more than one letter.
count = 10
To print the value of a variable you should just type its name.
N = 5
N
5
It should be possible to set a new value to an existing variable.
a = 1
a = 2
a = 3
a
3
If an identifier or value of a variable is invalid, the program must print a message like the one below.
a1 = 8
Invalid identifier
n = a2a
Invalid assignment
a = 7 = 8
Invalid assignment
"""#
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