use strict;
my $str = '### INFO
# Attempt to capture a parameter identifier inside a text selection, possibly
# wrapped in whitespace, including the following (examples using `backtick quotes`):
# - Raw word: e.g. `param_name`
# - $parameter expansion: e.g. `$param_name`
# - ${parameter} expansion e.g. `${param_name}`
### ENDINFO
testvar
testvar
test_var
test5_var
test_var5
$test_var
$test_var4
${test_var4}';
my $regex = qr/(?<=^ *)(?=\$(?:\{[a-z_][a-z0-9_]*\}|[a-z_][a-z0-9_]*)|[a-z_][a-z0-9_]*)(?:(?:\$\{)?([^ \}]+)\}?)(?= *$)/imp;
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