It looks to me like the regex is getting confused when it is backtracking. As BioLion notes above, jwrahn's explanation fits the output perfectly if we remove the \s* between each letter and digit, but it doesn't fit the output when the \s* is still in place.
while (<main::DATA>) { chomp; print "\nTesting '$_'\n"; /^(?:(?:(\d+)c\s*)|(?:(\d+)w\s*)|(?:(\d+)r\s*))+/i; print "Without \\s* : 1='$1', 2='$2', 3='$3'\n"; /^(?:(?:(\d+)\s*c\s*)|(?:(\d+)\s*w\s*)|(?:(\d+)\s*r\s*))+/i; print "With \\s* : 1='$1', 2='$2', 3='$3'\n"; }
outputs
Testing '1c' Without \s* : 1='1', 2='', 3='' With \s* : 1='1', 2='', 3='' Testing '2w' Without \s* : 1='', 2='2', 3='' With \s* : 1='', 2='2', 3='' Testing '2c3w' Without \s* : 1='2', 2='3', 3='' With \s* : 1='3', 2='3', 3='' Testing '1w1w' Without \s* : 1='', 2='1', 3='' With \s* : 1='1', 2='1', 3='' Testing '1w2r' Without \s* : 1='', 2='1', 3='2' With \s* : 1='2', 2='2', 3='2' Testing '2r1c' Without \s* : 1='1', 2='', 3='2' With \s* : 1='1', 2='', 3='2'
Best, beth
In reply to Re: Leaking Regex Captures
by ELISHEVA
in thread Leaking Regex Captures
by SuicideJunkie
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |