import Foundation
let pattern = #"^(?<numberExpression>(?<numberDice>[0-9]+)(?<gaussExpression>[oO]?(?<gaussDices>[0-9])+(?<gaussModifier>[\+\-])?)?)?[dD](?<faces>[0-9]+)(?<exploding>[¡!]{0,2})(?<modifierExpression>[\+\-](?<modifierValue>[0-9]+))?(?<thresholdExp>:(?<thresholdValue>[0-9]+))?"#
let regex = try! NSRegularExpression(pattern: pattern, options: .anchorsMatchLines)
let testString = #"""
Common dice:
1d2 (coin flip)
2d4
3d6
4d8
5d10
6d12
7d20
8d30
9d100
Gauss notation:
1o3d10 Basic notation
1o3+d10 Gauss with gauss-modifier
1o3-d10 Gauss with gauss-modifier
1o5d8 Gauss with other configurations
Exploding dice:
1d10! Exploding
1d10¡ Imploding
1d10!¡ Both, exploding and imploding
1d10¡! Another possible arrangement
1o3d10! Gauss exploding
Adding and substracting:
1d10+20
1d10-3
1o3d10+3 Gauss with modifiers
1o3d10!-3 Gauss with exploding dice and modifiers
Threshold:
1d10:6
1d10+2:8 Modifier and threshold
1d10!+1:8 Exploding, modifier and threshold
1o3+d10!+3:8 Gauss with gauss-modifier, exploding option, modifier and threshold
"""#
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