2013-10-29 27 views
1

因此,我正在運行一大堆文件,並通過批量重命名實用程序重命名它們。這個東西允許通過使用PERL-5的正則表達式進行重命名(或者至少它是這麼說的)我有一堆當前格式爲[id] - [歌曲名稱] - [藝術家]並需要交換的文件歌曲名稱和藝術家。PERL-5正則表達式奇怪地處理撇號

我用搶從文件信息的正則表達式爲:

(.*) - (.*) - (.*) 

然後重命名:

\1 - \3 - \2 

的問題是由於一些未知的原因,它的失敗,以匹配或正確地重新組織一些包含撇號的文件名,我找不到原因。

例子:

CBE4-08-03 - 我的Lovin'(你永遠要得到它) - 恩Vogue.zip < - 不匹配

CBE4-08-15 - 黑幫的天堂 - Coolio.zip < - 匹配和變化適當

CBE5-22-11 - 小白鴨 - 兒童Favorites.zip < - 比賽,變爲「 - 孩子 - 小白Duck.zi p「

真正令人憤慨的是,有很多次程序的重新命名文件與單詞」兒童「很好,但似乎絆倒其他人。

我知道這不是一個完全編程的問題,它可能只是我正在使用的程序,搞亂了某些東西,我只是好奇,是否真的有這個原因,我只是錯過了,如果有的話,這將是很好的知道將來使用。感謝您的任何信息。

+1

你能否包含你如何使用正則表達式的代碼片段? – Jerry

+0

不涉及編程。 – mob

+0

如果有任何正則表達式問題曾經是一個編程問題,那麼這是一個編程問題。它甚至有適當的輸入和例子 – Vorsprung

回答

2

這不是一個完整的答案,但在「黑幫天堂」中有一個實際的撇號字符(U+0027),但在其他兩個文件名中有一個正確的單引號(U+2019)。

我認爲你在Windows上,這意味着我認爲文件名是以UTF-16格式存儲的。看起來,它使用的Bulk Rename UtilityPCRE library對於8位範圍以外的字符無法正常工作。

我不知道它爲什麼會失敗(.*應匹配任何字符序列,但它們表示),但東西出錯了。

+0

好吧,那麼這可能是問題的根源。無法看到應用程序中的差異,在這裏幾乎看不到它。至少我可以停止拉我的頭髮,試圖找出爲什麼它爲一些而不是爲其他人工作。 – Kyouhen

+0

我不確定,但Perl5.6我認爲是該語言的Unicode的出現。即使它是一個控制序列,它應該被「。」選中,除非它是一個可能的EOS序列?也許FF(-1)。 – sln

+0

我的猜測是它不是撇號,而是 - 不是U + 002D,而是U + 2010或U + 2013或其他類似的。 – ysth

1

測試程序在Perl

use warnings; 
use strict; 

my @td = (q|CBE4-08-03 - My Lovin’ (You’re Never Gonna Get It) - En Vogue.zip|,   q|CBE4-08-15 - Gangsta's Paradise - Coolio.zip|, 
      q|CBE5-22-11 - Little White Duck - Children’s Favorites.zip|); 

for my $r (@td) { 
    $r =~s/(.*) - (.*) - (.*)/\1 - \3 - \2/; 
    close($file); 
} 

這並沒有表現出報告的行爲。我的命令

rename 's/(.*) - (.*) - (.*)/\1 - \3 - \2/' *.zip 

的版本也工作得很好

希望這有助於

0

嘗試一些不同的東西。

^(.*)-(.*)-(.*)$

^(.+)-(.+)-(.+)$

^([\S\s]*)-([\S\s]*)-([\S\s]*)$

^([\S\s]+)-([\S\s]+)-([\S\s]+)$

在所有情況下,不但是一個自由的空間存在。

+0

我使用了空格,因爲連字符有時顯示在歌曲名稱的中間,但它在分隔單獨的數據位時總是被空格包圍。無論哪種方式,我嘗試了我的第一個例子的例子,它是匹配的,但名稱正在改爲「 - - .zip」。所以帶走空間使它相匹配,但它不存儲任何東西。 :S – Kyouhen