package Regexp::Simple; use overload; use Parse::RecDescent; local $/; my $translate = Parse::RecDescent->new(); 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})" } | { quotemeta $item[1][2] } # etc. as necessary subpat: '(' pattern ')' { $item[2] } subpatlist: '(' pattern(s /,/) ')' { $item[2] } #### 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"; }