Регулярные выражения Perl: вопросительный знак не соответствует жадности - PullRequest
3 голосов
/ 23 сентября 2010
$var = 'about/';
$var =~ s/^(.*)\/?$/index.php?action=$1/;

Я хочу, чтобы он совпадал и заменял косую черту.Но это не так, я получаю такой результат:

index.php?action=about/

Что я делаю не так?Я попытался заключить его в круглые скобки (\/)? и включить вопросительный знак в круглые скобки (\/?).Не считая предыдущего слеша, очевидно, не приносит мне никакой пользы.Так как я могу заставить его съесть косую черту, когда она там есть?

Ответы [ 3 ]

11 голосов
/ 23 сентября 2010

Ваша проблема в том, что .* тоже жадный. Попробуйте использовать .*?.

Движок Regex сначала расширяет .*, насколько это возможно, а затем проверяет, может ли регулярное выражение соответствовать входным данным. В вашем случае так и есть, поскольку косая черта не обязательна. Затем он идет домой довольный.

4 голосов
/ 23 сентября 2010

Сделать .* несмешным:

$var = 'about/';
$var =~ s!^(.*?)/?$!index.php?action=$1!;
0 голосов
/ 24 сентября 2010

В своей замене вы очень стараетесь указать, что вы храните. В этом случае намного легче избавиться от того, что вы не хотите. Если для вашего приложения сложно использовать функцию, это признак того, что вы используете неправильную функцию.

Похоже, что вы хотите сделать, это удалить последний / в строке. Итак, просто удалите последний /:

 my $path = 'about/';
 $path = s|/\z||;

 my $action = "index.php?action=$path";

Если вы действительно хотите сделать это на месте (сомнительная цель), вы можете просто сделать это:

 ( my $action = "index.php?action=$path" ) =~ s|/\z||; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...