On Wed, Apr 15, 2015 at 09:45:39PM -0400, Nathan Gray wrote: > I had given up on using regexes embedded within regexes, because > I could not get capturing to work.
I did a backtrace on one of the test cases that fails, which led
me to
src/core/Cursor.pm
in
method INTERPOLATE(\var, $i = 0, $s = 0, $a = 0)
with this comment:
# Call it if it is a routine. This will capture if requested.
return (var)(self) if nqp::istype(var,Callable);
This seems to indicate that captures in the embedded regexes
should capture.
When the capture does not happen, is this a bug?
The test cases I came up with, that illustrate capturing from
embedded regexes (some which work, some which do not), are
included below.
-kolibrie
use v6;
use Test;
my $year = '2015';
my $month = '04';
my $day = '11';
my $date_string = "$year-$month-$day";
my $year_regex = rx/$<year>=[\d**4]/;
my $month_regex = rx/$<month>=[\d\d?]/;
my $day_regex = rx/$<day>=[\d\d?]/;
my $separator = rx/'-'/;
# Single named capture.
{
ok($date_string ~~ $year_regex, 'date string matches year regex');
is(~$/, $year, 'matched is year string');
is(~$/<year>, $year, 'year is captured');
}
# Single named capture in slashes.
{
ok($date_string ~~ /$year_regex/, 'date string matches year regex when in
slashes');
is(~$/, $year, 'matched is year string when in slashes');
is(~$/<year>, $year, 'year is captured when in slashes'); # Fails
}
# Single named capture embedded in named capture.
{
ok($date_string ~~ /$<pattern>=$year_regex/, 'date string matches year
regex when embedded');
is(~$/, $year, 'matched is year string when embedded');
is(~$/<pattern>, $year, 'pattern is captured when embedded');
is(~$/<pattern><year>, $year, 'year is captured when embedded');
}
# Single named capture embedded in named capture with brackets.
{
ok($date_string ~~ /$<pattern>=[$year_regex]/, 'date string matches year
regex when embedded with brackets');
is(~$/, $year, 'matched is year string when embedded with brackets');
is(~$/<pattern>, $year, 'pattern is captured when embedded with brackets');
is(~$/<pattern><year>, $year, 'year is captured when embedded with
brackets'); # Fails
}
# Multiple named captures.
{
ok($date_string ~~ /$year_regex $separator $month_regex $separator
$day_regex/, 'date string matches multiple regexes in slashes');
is(~$/, $date_string, 'matched is date string in multi regex with slashes');
is(~$/<year>, $year, 'year is captured in multi regex with slashes'); #
Fails
is(~$/<month>, $month, 'month is captured in multi regex with slashes'); #
Fails
is(~$/<day>, $day, 'day is captured in multi regex with slashes'); # Fails
}
# Multiple named captures embedded in named capture.
{
ok($date_string ~~ /$<pattern>=$year_regex $separator $month_regex
$separator $day_regex/, 'date string matches multiple regexes when embedded');
is(~$/, $date_string, 'matched is date string in multi regex when
embedded');
is(~$/<pattern>, $year, 'pattern is captured in multi regex when embedded');
is(~$/<pattern><year>, $year, 'year is captured in multi regex when
embedded');
is(~$/<month>, $month, 'month is captured in multi regex when embedded');
# Fails
is(~$/<day>, $day, 'day is captured in multi regex when embedded'); # Fails
}
# Multiple named captures embedded in named capture with brackets.
{
ok($date_string ~~ /$<pattern>=[$year_regex $separator $month_regex
$separator $day_regex]/, 'date string matches multiple regexes when embedded
with brackets');
is(~$/, $date_string, 'matched is date string in multi regex when embedded
with brackets');
is(~$/<pattern>, $date_string, 'pattern is captured in multi regex when
embedded with brackets');
is(~$/<pattern><year>, $year, 'year is captured in multi regex when
embedded with brackets'); # Fails
is(~$/<pattern><month>, $month, 'month is captured in multi regex when
embedded with brackets'); # Fails
is(~$/<pattern><day>, $day, 'day is captured in multi regex when embedded
with brackets'); # Fails
}
signature.asc
Description: Digital signature
