I\'m trying to escape several special characters in a given string using perl regex. It works fine for all characters except for the dollar sign. I tried the following:
You don't need a hash if you're replacing each character with itself preceded by a backslash. Just match what you need and put a backslash in front of it:
s/($re)/"\\$1"/eg;
To build up the regular expression for all of the characters, Regexp::Assemble is really nice.
use v5.10.1;
use Regexp::Assemble;
my $ra = Regexp::Assemble->new;
my @specials = qw(_ $ { } # % & );
foreach my $char ( @specials ) {
$ra->add( "\\Q$char\\E" );
}
my $re = $ra->re;
say "Regex is $re";
while( ) {
s/($re)/"\\$1"/eg;
print;
}
__DATA__
There are $100 dollars
Part #1234
Outside { inside } Outside
Notice how, in the first line of input, Regexp::Assemble has re-arranged my pattern. It's not just the glued together bits of the parts I added:
Regex is (?^:(?:[#$%&_]|\{|\}))
There are \$100 dollars
Part \#1234
Outside \{ inside \} Outside
If you want to add more characters, you just put the character in @specials. Everything else happens for you.