Регулярное выражение Perl: как заменить все нужные символы, кроме первого - PullRequest
6 голосов
/ 21 апреля 2011

У меня есть регулярное выражение, которое заменяет все специальные символы на% (для поиска в базе данных с помощью LIKE).Выглядит это так:

$string =~ s/[^ a-zA-Z0-9]/%/g;

Однако я не знаю, как изменить это выражение, чтобы заменить все нужные специальные символы, КРОМЕ первого в строке.Поэтому, если моя строка будет выглядеть как

"&Hi I'm smart(yeah right...)"

, это будет

"&Hi I%m smart%yeah right%%%%"

(Прямо сейчас также заменяется первый '&').

Может ли кто-нибудь помочь?

Ответы [ 3 ]

3 голосов
/ 21 апреля 2011

Изменяет все, кроме первого экземпляра цели совпадения, на символ процента:

{
    my $count = 0;
    $string =~ s{([^ a-zA-Z0-9])}{$count++ ? "%" : $1}ge;
}
3 голосов
/ 21 апреля 2011

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

s/(?<=.)[^ a-zA-Z0-9]/%/g;
2 голосов
/ 21 апреля 2011
substr($string, 1) =~ s/[^ a-zA-Z0-9]/%/g;

Обновление : вышеуказанное работает только в том случае, если спецсимвол является первым символом строки. Следующее работает независимо от того, где оно находится:

my $re = qr/[^ a-zA-Z0-9]/;
my @parts = split(/($re)/, $string, 2);
$parts[2] =~ s/$re/%/g if @parts == 3;
$string = join('', @parts);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...