2014-01-27 24 views
1

我試圖從邏輯方式組織的文件夾列表中提取信息,但它包含可選部分。perl中的字符串掩碼知道格式變化

下面是我用可選字段的文件夾結構內<注意>:

artist - album_nr. album_title <(type)> <(issue_info)> (year) [quality] 

所以某些目錄的例子將被命名爲這樣

Emperor - 03. Reverence (EP) (1997) [flac] 
Emperor - 05b. IX Equilibrium (reissue 2007) (1999) [cue-flac] 
Exodus - 01a. Bonded By Blood (1985) [cue-flac] 
Exodus - 01b. Bonded By Blood (remaster 2008) (1985) [cue-flac] 
Exodus - 03.Tempo of the Damned (EP) (remaster 2008) (1985) [cue-flac] 

我需要一個正則表達式,將正確地拉相關的部分放到一個數組中進行進一步處理,但我很掙扎,主要是因爲可選字段。

最多隻能包含7條信息和5條信息。

如果任何人都可以幫助我,我將非常感激,它會爲我節省大量的人力。

+1

_I需要regex_ ...不,你需要先學習正則表達式。 – Jerry

+0

這很有幫助。我在一個藍色的月亮中使用正則表達式來做一些處理,我可能需要在家裏進行個人使用。由於這是每18個月大約一次,我就像我學習它那樣快速地忘記它。對於每天使用它的人來說,這個問題可能是微不足道的,但對於那些習慣於完全不同的編程方法的人來說,這個問題可能並不重要。 – Reptile

+1

@Reptile:問題是,網站上的大多數人都在這裏互相幫助學習。當你說你對學習不感興趣時​​,你說的是沒有什麼東西可以幫助你。 – ruakh

回答

1

使用擴展標記的可讀性:

my $re = qr/ 
    ([^-]+?)   # artist 
    \h*    # 
    -     # literal '-' 
    \h*    # 
    ([0-9]+[a-z]?) # album number 
    \.    # literal '.' 
    \h*    # 
    ([^(]+?)   # album title 
    \h*    # 
    (?:\(([^)]+)\))? # type (optional) 
    \h*    # 
    (?:\(([^)]+)\))? # issue info (optional) 
    \h*    # 
    \(([^)]+)\)  # year 
    \h*    # 
    \[(.+)\]   # quality 
/x; 

注意,這個表達式總是返回七個值(對比賽),因爲有七個捕獲。

您說您遇到問題的可選部件的「竅門」是在捕獲,非捕獲和文字括號之間進行導航。正則表達式的那些部分細分如下:

(?: # begin non-capturing grouping (for '?' quantifier at the end) 
\( # literal '(' 
(  # begin capture 
[^)]+ # any character other than ')', one or more times 
)  # end capture 
\)  # literal ')' 
)  # end non-capturing grouping 
?  # zero or one quantifier (make everything in group optional) 

編輯:在評論,傑里正確地指出,有關於在只有可選字段中的一個(類或發佈信息)存在於哪些匹配的潛在的不確定性數據。這可以通過使正則表達式不受寬容(可能無法匹配某些數據 - 總是檢查匹配是否成功)來解決。本工程爲您提供的樣本數據:

(?:\((\w+\h+[0-9]{4}+)\))? # issue info (optional) 

如果我們這樣做,似乎也謹慎地使一年多也具有限制性的。

\(([0-9]{4})\) # year 
+0

謝謝!我將與此合作,看看結果如何併發布最終結果。 – Reptile

+0

如果我是你,我會用一個稍微不同的正則表達式。這個想法很好,但是如果每個字段都很重要,那麼你就不應該在'type'字段應該有'issue_info'字段中。你用命名捕捉看到它更清晰一點:[link](http:// regex101。com/r/gT8gM1),而不是[link](http://regex101.com/r/vN0zN0)。 OP沒有提到所有的規則,但是這與樣本通知的內容相同。 – Jerry

+0

是的,您的第二個鏈接在指定的信息上提供了更可靠的匹配。感謝大家的意見。我現在有了一個基地,可以進一步改進提取過程的其他領域。我希望用這個來填充收集到的信息中的標籤。 – Reptile