通配符后的可选匹配模式

问题描述:

我正在尝试使用正则表达式执行模式匹配,并且似乎无法捕获某个部分,并且后面跟随一个可选部分,所有部分都在通配符捕获之后。我不知道如何解决它。通配符后的可选匹配模式

这里有匹配

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

就像我在我的评论中说的,您需要将第一个.*更改为.*?。因为.*是贪婪的,它尽可能匹配所有字符。将其更改为.*?,将执行非贪婪的匹配。

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

DEMO

+0

这一个为我想要的完美工作 – kschieck 2015-01-21 17:29:47

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

试试看。

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

只要改变你的第一个(.*)(.*?)使其不贪婪让它捕捉到你想要的东西。