通配符后的可选匹配模式

时间:2015-01-21 06:34:04

标签: regex pattern-matching regex-greedy

我正在尝试使用正则表达式进行模式匹配,似乎我无法捕获带有可选部分的某个部分,所有部分都遵循通配符捕获。我不确定如何解决它。

以下是匹配

的可能正则表达式的两个不同示例
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*\))$ 由于添加了第二个Season#Episode#,因此与MasterChef Junior example匹配,但与Parks and Recreation example不匹配。

我已经尝试添加一个可选的匹配来捕获第二个SeasonxEpisode,但似乎开头的外卡正在捕捉所有内容并且该模式忽略了可选部分(因为它不需要使用它匹配)。

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

如何解决此正则表达式问题?有没有办法我可以在非greedy方式开始捕捉外卡?

2 个答案:

答案 0 :(得分:2)

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

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

DEMO

答案 1 :(得分:0)

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

试试这个。看看演示。

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

只需将您的第一个(.*)更改为(.*?)即可让它非贪婪,让它捕获您想要的内容。