我正在尝试使用正则表达式进行模式匹配,似乎我无法捕获带有可选部分的某个部分,所有部分都遵循通配符捕获。我不确定如何解决它。
以下是匹配
的可能正则表达式的两个不同示例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方式开始捕捉外卡?
答案 0 :(得分:2)
就像我在评论中所说的那样,您需要将第一个.*
更改为.*?
。因为.*
是贪婪的,并且它尽可能匹配所有字符。将其更改为.*?
,将进行非贪婪的匹配。
^(.*?) (\d*)x(\d*)(?:\s*&\s*\d*x\d*)?\s*(.*) (\(\d*\))$
答案 1 :(得分:0)
^(.*?) (\d*)x(\d*)\s*(.*?) (\(\d*\))$
试试这个。看看演示。
https://regex101.com/r/tX2bH4/59
只需将您的第一个(.*)
更改为(.*?)
即可让它非贪婪,让它捕获您想要的内容。