2015-01-21 40 views
0

我正在嘗試使用正則表達式執行模式匹配,並且似乎無法捕獲某個部分,並且後面跟隨一個可選部分,所有部分都在通配符捕獲之後。我不知道如何解決它。通配符後的可選匹配模式

這裏有匹配

MasterChef Junior 3x03 Grandad Gordon! (2015) 
Parks and Recreation 7x03 & 7x04 William Henry Harrison (2015) 

可能正則表達式的兩個不同的例子,我需要捕捉標題(MasterChef Junior),季節(3),情節(03)和劇集名稱(Grandad Gordon!) 。

我所創建的正則表達式模式^(.*) (\d*)x(\d*)\s*(.*) (\(\d*\))$ 其中MasterChef Junior example匹配,但不是因爲Parks and Recreation example加入第二Season#Episode#的。

我嘗試添加一個可選匹配來捕獲第二個SeasonxEpisode,但它似乎在開始的通配符捕捉所有內容,並且該模式忽略可選部分(因爲它不需要使用它來匹配)。

example with optional(?:\s*&\s*\d*x\d*)?

我該如何解決這個問題的正則表達式?有沒有辦法以非greedy的方式在開始時捕捉通配符?

+1

你的意思是這個https://www.regex101.com/r/uU8sS1/4?使第一個'。*'非貪婪。 – 2015-01-21 06:36:23

回答

1

就像我在我的評論中說的,您需要將第一個.*更改爲.*?。因爲.*是貪婪的,它儘可能匹配所有字符。將其更改爲.*?,將執行非貪婪的匹配。

^(.*?) (\d*)x(\d*)(?:\s*&\s*\d*x\d*)?\s*(.*) (\(\d*\))$ 

DEMO

+0

這一個爲我想要的完美工作 – kschieck 2015-01-21 17:29:47

0
^(.*?) (\d*)x(\d*)\s*(.*?) (\(\d*\))$ 

試試看。

https://regex101.com/r/tX2bH4/59

只要改變你的第一個(.*)(.*?)使其不貪婪讓它捕捉到你想要的東西。