通配符后的可选匹配模式

Optional match pattern after wildcard

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

这里有两个可能匹配的正则表达式的不同示例

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, but not the Parks and Recreation example

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

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

如何解决这个正则表达式问题?有没有一种方法可以在开始时以非 greedy 的方式捕获外卡?

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

尝试 this.See 演示。

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

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

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

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

DEMO