2012-02-19 56 views
3

在源代碼中,我必須閱讀(而不是從我這裏)我發現了一個正常工作的正則表達式(或者至少它的代碼是沒有做它應該做的)。Perl的正則表達式意味着如果沒有現有的斜槓,就不會增加尾隨斜槓

正則表達式的想法是確保它處理的字符串在最後有一個斜線。

所以在這裏,我們去:

$string =~ s/\/*$/\//g; # Add a trailing slash 

我看這是「發現在字符串的結尾任何數量的斜槓(包括0),並用單斜槓替換它們。」但這不是發生的事情。

正則表達式雙打 an /多個現有的尾部斜槓(es)。所以,如果已經有一個或多個,我最終會以兩個斜槓結束。如果沒有我得到一個(因爲它會是這個想法)。

例如,我可以用Regex tester來重現它。只需在頂部框中輸入http://example.com/foo/(並在最後使用不同的斜線計數進行更改),第二個爲正則表達式,「/」作爲替換模式並點擊「發送」。

它似乎圍繞正則表達式也用斜線代替「無」(或行結尾?)(所以它用一個斜線代替「nothing」,而用一個斜線代替兩個斜線的現有斜線我懂了...)。

我用

$string =~ s/\/{1,0}$/\//g; # Add a trailing slash 

還,但如果從一開始就至少一個斜線這僅適用。

編輯

以防萬一你想知道:

$string =~ s/\/*\z/\//g; # Add a trailing slash 

產生同樣的事情。

這裏是一個direct link to the test page

回答

5

的問題是/g改性劑,它說要全部替換。當你在字符串的末尾有一個斜線時,Perl會做兩個替換。首先,它用另一個斜槓代替斜線。然後(因爲$是一個零寬度斷言,並且不消耗任何字符),所以它用斜槓替換最後的空字符串。取出/g,它會工作,因爲只有第一場比賽將被替換:

$string =~ s!/*$!/!; # Add a trailing slash 

(我也改變了分隔符,以使其更具可讀性,儘管這已經無關,與你的問題。)

+0

謝謝!那*非常*快! – scherand 2012-02-19 23:21:48

相關問題