in reply to Pondering Regex::English

Here's an alternative I've been playing with:
package Regexp::Simple; use overload; use Parse::RecDescent; local $/; my $translate = Parse::RecDescent->new(<DATA>); sub import { overload::constant qr => sub { return $translate->pattern($_[0]); } } 1; __DATA__ { sub wrap { "(?:$_[0])".($_[1]||"") } } pattern: element(s) { join '', @{$item{element}} } element: 'start_of_line' { '^' } | 'whitespace' { '\\s' } | 'digit' { '\\d' } | 'non_digit' { '\\D' } | 'literal' subpat { wrap $item{subpat} } | 'optional' subpat { wrap $item{subpat}, '?' } | 'many' subpat { wrap $item{subpat}, '+' } | 'any' subpatlist { wrap join "|", @{$item{subpatlist}} } | 'remember' subpat { "($item{subpat})" } | <perl_quotelike> { quotemeta $item[1][2] } # etc. as necessary subpat: '(' pattern ')' { $item[2] } subpatlist: '(' pattern(s /,/) ')' { $item[2] }

Then your example would become:

use Regexp::Simple; my $re = qr{ start_of_line literal("1998/10/08") optional( whitespace ) literal("[") remember( many( any( ":", digit ) ) ) non_digit }; if ('1998/10/08 [11:10]' =~ m/$re/) { print "Found a match at time $1!\n"; }
Since we all seem to be converging, I'll be happy collaborate (I have many more ideas for this module than those shown above above and it would be great to have someone else share the implementation effort.

Send me some email if either (or both) of you are interested.

And, yes, the Regexp:: namespace is an abomination.
But it's the standard abomination for Perl 5, so we should use it.

Damian