2012-01-22 60 views
1

我有一個變量,如下列:刪除從文件名末尾空間(S)

$str1 = 'some random book cover .jpg'; 
$str2 = 'some random cd cover .jpg'; 

,我想在文件擴展名的時間段之前刪除前導空格等等上面的例子應該是這樣的:

$str1 = 'some random book cover.jpg'; 
$str2 = 'some random cd cover.jpg'; 

那裏可能有任意數量的空格。我可以(並且在用正則表達式解決之後)在perl中編寫一個可用的小子程序來做到這一點,但是這看起來像是一個將被自定義爲正則表達式的東西。 Unfortunatley我的regexp-fu能力是缺乏的。

有人能告訴我我的方式的錯誤,並緩解我困擾的心靈?

回答

5
$subject =~ 
    s/\s+ # Match one or more spaces 
    (?=  # if they are followed by 
    \.  # a dot 
    [^.]* # and any number of characters except dots 
    $  # up to the end of the string. 
    ) 
    //xg; 

應該這樣做,假設您正在尋找任何類型的文件擴展名,而不僅僅是jpg

(?=...)是一個所謂的lookahead assertion,它確定封閉可以在當前位置匹配,但不包括在匹配結果中。

+0

是啊,這正是我一直在尋找!是的,我有任何數量的文件擴展名處理。在...之前,我並沒有意識到「?=」。非常感謝! – user1163553

+0

如果我正確地記住它,有一個網站可以分析正則表達式。你能給我鏈接嗎? –

+1

@Shiplu:我不知道一個網站。我只知道(並使用)[RegexBuddy](http://www.regexbuddy.com)。 –

0

貪婪匹配的解決方案:

s/^(.*\S)\s+\./$1./