Несколько подстановок с одним регулярным выражением в perl - PullRequest
1 голос
/ 29 июня 2010

Скажите, у меня есть следующее в Perl:

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

Можно ли выполнить вышеуказанные замены одним объединенным регулярным выражением вместо трех отдельных?

Ответы [ 3 ]

9 голосов
/ 29 июня 2010
$string =~ s/([ '`])/\\$1/g;

Использует класс символов [ '`] для соответствия одному из пробелов 'или `и использует скобки () для запоминания соответствующего символа.$1 затем используется для включения запомненного символа в замену.

4 голосов
/ 29 июня 2010

Отдельные замены могут быть намного эффективнее, чем одиночные сложные (например, при работе с фиксированными подстроками). В таких случаях вы можете сделать код короче, например так:

my $string;    
for ($string) {
    s/ /\\ /g;
    s/'/\\'/g;
    s/`/\\`/g;
}
2 голосов
/ 29 июня 2010

Хотя, возможно, легче читать то, что есть у вас сейчас, вы можете выполнить эти замены сразу, используя цикл или объединяя их в одном выражении:

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

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

Кстати, вы можете немного облегчить чтение замен, избегая «синдрома наклоняющейся зубочистки», поскольку различные операторы регулярных выражений позволяют использовать различные разделители:

$string =~ s{ }{\\ }g;
$string =~ s{'}{\\'}g;
$string =~ s{`}{\\`}g;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...