const regex = /^(?<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]+))?/gm;
// Alternative syntax using RegExp constructor
// const regex = new RegExp('^(?<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]+))?', 'gm')
const str = `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`;
// Reset `lastIndex` if this regex is defined globally
// regex.lastIndex = 0;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}
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 JavaScript, please visit: https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions