use strict;
my $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';
my $regex = qr/^(?<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]+))?/mp;
if ( $str =~ /$regex/g ) {
print "Whole match is ${^MATCH} and its start/end positions can be obtained via \$-[0] and \$+[0]\n";
# print "Capture Group 1 is $1 and its start/end positions can be obtained via \$-[1] and \$+[1]\n";
# print "Capture Group 2 is $2 ... and so on\n";
}
# ${^POSTMATCH} and ${^PREMATCH} are also available with the use of '/p'
# Named capture groups can be called via $+{name}
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 Perl, please visit: http://perldoc.perl.org/perlre.html