2010-06-13 113 views
0

我正在寫一個正則表達式來匹配來自IMDb音軌數據文件的數據。我的正則表達式大部分都在工作,儘管它們在我的指定組中混淆了太多文本。看看下面的正則表達式,例如:正則表達式太貪婪

"^ Performed by '?(?<performer>.*)('? \(qv\))?$" 

的表演組包含字符串' (qv)以及表演者的名字。不幸的是,由於記錄的格式不一致,有些表演者的名字被單引號包圍,而另一些則沒有。這意味着就正則表達式而言它們是可選的。

我試過使用?>組說明符將最後一組標記爲貪婪組,但這似乎對結果沒有影響。

我可以通過更改演員組來匹配小範圍的字符來改善結果,但這會減少我正確解析名稱的機會。此外,如果我只是排除撇號字符,那麼我將無法解析,例如包含撇號的樂隊名稱,如埃利亞的孤獨朋友樂隊誰執行了奔向你的生活特色生化危機:啓示錄

更新:下面是正則表達式應該匹配的示例輸入行,根據要求。其他格式也呈現,我現有的正則表達式不會處理。

" Performed by 'Carmen Silvera' (qv)" 
+0

你可以舉一些例子輸入嗎?你的問題有點混亂。 – 2010-06-14 00:12:04

+0

是否每個記錄都跟着'(qv)'?如果是這樣,爲什麼最後一個分組標記爲可選? – Jay 2010-06-14 00:35:23

+0

...如果使用'^執行者'會發生什麼?(?。*?)('?\(qv \))?$'?在演員組中添加一個問號以使星號非貪婪。 – Jay 2010-06-14 00:37:53

回答

2

儘管我查看了IMDB音軌數據文件,但這並不能解決所有問題。

var exp = new Regex(@"^ Performed by '?(?<performer>.*?)('? \(qv\))?$"); 

基本上你需要指定表演匹配非貪婪搜索。

我會添加一條評論來解釋爲什麼這對您的項目長期來說不夠好。

+0

你會遇到的「* fun *」問題將會是這樣的多表演者輸入: 由'JoséCarreras(IV)'(qv),'Fina Brunet'(qv),'Susanna Griso '(qv)和'Gemma Nierga'(qv) 結合名稱解析是由多個不同標籤共享(而不僅僅是「執行者」),這表明我想要找到一個在一般情況下從字符串中提取所有名稱列表的好方法。 – 2010-06-14 00:55:37

+0

是的,我目前爲出版商,表演者,作詞家和作曲家製作了單獨的正則表達式,並對輸入進行了一些欺騙(例如「Written by」將我解析對象的作曲家和歌詞作者屬性設置爲相同的值) 。我知道我的正則表達式目前還沒有捕獲到很多場景,我想從簡單的事情開始,一次一點地構建起來。 – alastairs 2010-06-14 08:18:37

+0

公平 - 對你的項目好運 - 如果沒有別的,非標準化格式應該提供一些有趣的心理困惑。 – 2010-06-14 10:13:51