1

Say I have the following in perl:

my $string;
$string =~ s/ /\\ /g;
$string =~ s/'/\\'/g;
$string =~ s/`/\\`/g;

Can the above substitutions be performed with a single combined regular expression instead of 3 separate ones?

Andreas Grech
  • 105,982
  • 98
  • 297
  • 360

3 Answers3

9
$string =~ s/([ '`])/\\$1/g;

Uses a character class [ '`] to match one of space, ' or ` and uses brackets () to remember the matched character. $1 is then used to include the remembered character in the replacement.

mikej
  • 65,295
  • 17
  • 152
  • 131
4

Separate substitutions may be much more efficient than a single complex one (e.g. when working with fixed substrings). In such cases you can make the code shorter, like this:

my $string;    
for ($string) {
    s/ /\\ /g;
    s/'/\\'/g;
    s/`/\\`/g;
}
Eugene Yarmash
  • 142,882
  • 41
  • 325
  • 378
2

Although it's arguably easier to read the way you have it now, you can perform these substitutions at once by using a loop, or combining them in one expression:

# loop
$string =~ s/$_/\\$_/g foreach (' ', "'", '`');

# combined
$string =~ s/([ '`])/\\$1/g;

By the way, you can make your substitutions a little easier to read by avoiding "leaning toothpick syndrome", as the various regex operators allow you to use a variety of delimiters:

$string =~ s{ }{\\ }g;
$string =~ s{'}{\\'}g;
$string =~ s{`}{\\`}g;
Ether
  • 53,118
  • 13
  • 86
  • 159