【问题标题】:Optional match pattern after wildcard通配符后的可选匹配模式
【发布时间】:2015-01-21 06:34:04
【问题描述】:

我正在尝试使用正则表达式进行模式匹配,但似乎我无法捕获某个部分,它后面有一个可选部分,所有这些都遵循通配符捕获。不知道怎么解决。

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

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 的方式在开始时捕获通配符?

【问题讨论】:

标签: regex pattern-matching regex-greedy


【解决方案1】:

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

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

DEMO

【讨论】:

    【解决方案2】:
    ^(.*?) (\d*)x(\d*)\s*(.*?) (\(\d*\))$
    

    试试这个。查看演示。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      • 1970-01-01
      相关资源
      最近更新 更多