2010-09-23 77 views
3
$var = 'about/'; 
$var =~ s/^(.*)\/?$/index.php?action=$1/; 

我希望它匹配並替換結尾的斜槓。但它不是,我得到這個結果:Perl正則表達式:問號不是貪婪地匹配

index.php?action=about/ 

我在做什麼錯了?我試過用圓括號(\/)?包裝它,並在括號(\/?)中包括問號。不包括前面的正斜槓顯然對我沒有任何好處。那麼,我怎麼才能在它到來的時候把它吃掉呢?

+6

你會發現你的代碼更易讀如果你爲包含斜槓的正則表達式選擇不同的分隔符。我通常使用'!',因爲它在正則表達式中不常用。例如'!^(。*)/?$!index.php?action = $ 1!' – cjm 2010-09-23 09:13:13

回答

11

你的問題是,.*也是貪婪的。嘗試使用.*?

正則表達式引擎首先儘可能擴展.*,然後檢查正則表達式是否可以匹配輸入。在你的情況,它的確如此,因爲尾部的斜線是可選的。然後它回家滿意。

+0

哦,當然。 *嘆* RegEx一直給我帶來麻煩,因爲總有這樣的事情能夠讓我陷入困境。謝謝! – 2010-09-23 08:50:18

+1

訣竅是不要使用比你真正需要更多的正則表達式。 :) – 2010-09-23 20:45:30

4

.* ungreedy:

$var = 'about/'; 
$var =~ s!^(.*?)/?$!index.php?action=$1!; 
0

在你的替代,你想真的很難指定你保持什麼。在這種情況下,擺脫你不想要的東西要容易得多。當某個功能似乎很難用於您的應用程序時,這表示您使用了錯誤的功能。

它看起來像你想要做的是刪除最後/在一個字符串。所以,僅僅刪除最後一個/:

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

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

如果你真的想做這就地(一個可疑目標),你可能只是這樣做:

(my $action = "index.php?action=$path") =~ s|/\z||; 
+0

不完全是我想要做的。這是一個正則表達式,最終將進入MOD_REWRITE RewriteRule。這只是最終結果的一部分。我只是在Perl中對它進行測試,並將它們放在一起,以便我知道它會在我最終將其放入htaccess文件時執行所需的操作。 – 2010-09-24 04:00:59

+0

這將是包含在你的問題中的好信息。當我發現我浪費了我的時間時,總是有點難過,因爲提問者忽略了這些非常重要的信息。 – 2010-09-24 04:11:46