In many situations, users may want to specify patterns to match but don't need the full power of regexps. Wildcards make one of those sets of simplified rules. This module converts wildcard expressions to Perl regular expressions, so that you can use them for matching.
-It handles the C<*> and C<?> jokers, as well as Unix bracketed alternatives C<{,}>, but also C<%> and C<_> SQL wildcards. It can also keep original C<(...)> groups. Backspace (C<\>) is used as an escape character.
+It handles the C<*> and C<?> jokers, as well as Unix bracketed alternatives C<{,}>, but also C<%> and C<_> SQL wildcards. If required, it can also keep original C<(...)> groups or C<^> and C<$> anchors. Backspace (C<\>) is used as an escape character.
Typesets that mimic the behaviour of Windows and Unix shells are also provided.
commas => ',',
brackets => '{},',
groups => '()',
+ anchors => '^$',
);
my %captures = (
=head2 C<< do [ $what E<verbar> set => $c1, add => $c2, rem => $c3 ] >>
-Specifies the list of metacharacters to convert.
-They are classified into five classes :
+Specifies the list of metacharacters to convert or to prevent for escaping.
+They fit into six classes :
=over 4
'a(b(c))d\\(\\)' ==> (no change)
+=item *
+
+C<'anchors'> prevents the beginning-of-line C<^> and end-of-line C<$> anchors to be escaped. Since C<[...]> character class are currently escaped, a C<^> will always be interpreted as such.
+
+ 'a^b$c' ==> (no change)
+
=back
Each C<$c> can be any of :
--- /dev/null
+#!perl -T
+
+use strict;
+use warnings;
+
+use Test::More tests => 16;
+
+use Regexp::Wildcards;
+
+my $rw = Regexp::Wildcards->new(do => 'anchors');
+
+is($rw->convert('\\^'), '\\^', 'anchor: escape ^ 1');
+is($rw->convert('\\\\\\^'), '\\\\\\^', 'anchor: escape ^ 2');
+is($rw->convert('\\$'), '\\$', 'anchor: escape $ 1');
+is($rw->convert('\\\\\\$'), '\\\\\\$', 'anchor: escape $ 2');
+
+is($rw->convert('^a?b*'), '^a\\?b\\*', 'anchor: ^');
+is($rw->convert('a?b*$'), 'a\\?b\\*$', 'anchor: $');
+is($rw->convert('^a?b*$'), '^a\\?b\\*$', 'anchor: ^$');
+is($rw->convert('x^a?b*$y'), 'x^a\\?b\\*$y', 'anchor: intermediate ^$');
+
+$rw->do(add => 'jokers');
+
+is($rw->convert('^a?b*'), '^a.b.*', 'anchor: ^ with jokers');
+is($rw->convert('a?b*$'), 'a.b.*$', 'anchor: $ with jokers');
+is($rw->convert('^a?b*$'), '^a.b.*$', 'anchor: ^$ with jokers');
+is($rw->convert('x^a?b*$y'), 'x^a.b.*$y','anchor: intermediate ^$ with jokers');
+
+$rw->do(add => 'brackets');
+
+is($rw->convert('{^,a}?b*'), '(?:^|a).b.*', 'anchor: ^ with brackets');
+is($rw->convert('a?{b*,$}'), 'a.(?:b.*|$)', 'anchor: $ with brackets');
+is($rw->convert('{^a,?}{b,*$}'),'(?:^a|.)(?:b|.*$)','anchor: ^$ with brackets');
+is($rw->convert('x{^,a}?b{*,$}y'), 'x(?:^|a).b(?:.*|$)y',
+ 'anchor: intermediate ^$ with brackets');