我试图创建一个匹配某些字符串部分的正则表达式。 我不必匹配每个部分,但至少有一个(它总是会)
我想:名字和年份和/或季节/剧集。
让我说我有这些字符串:
我想得到这些比赛:
1.
name = i.want.this.as.name.
year = 2014
seasonepisode = s01e02
season = 01
episode = 02
2.
name = i still want a this
year = 2010
3.
name = i also want this
4.
name = I still want this
seasonepisode = s05e23
season = 05
episode = 23
现在,我有这个正则表达式:
(?<name>.*)(?<year>\d{4})(\s|\.|\z)*(?<seasonepisode>s(?<season>\d{1,2})e(?<episode>\d{1,2}))*
但我只在第一个字符串上得到了所需的结果。我想这是因为字符串2,3或4中的完整正则表达式没有匹配。
您可以在这里试用正则表达式:http://rubular.com/r/1ypseJ7c6I
所以我的问题是,我如何告诉正则表达式我不需要对所有内容进行匹配,只是一些东西? :-)我尝试将asterix添加到opitonal。
5€捐赠给您选择的项目/慈善机构以获得正确答案:-)
答案 0 :(得分:2)
这可能有效:http://rubular.com/r/4qYuzGGqaB。使用/ix
选项,后者是为了便于阅读。
^
(?<nm>.+?) # Name: at least one character, non-greedy.
(?<yr>\d{4})? # Year, optional.
(?: # Post-year stuff, non-captured.
[\s\.]
s(?<se>\d\d?) # Season.
e(?<ep>\d\d?) # Episode.
(?<rest>.*) # The rest, optional.
)? # Post-year stuff is optional.
$ # Must consume full line.
几点说明:
名字组的非贪婪很重要。否则,它将很乐意消耗整行(其他一切都是可选的)。
要求全线匹配也很重要。否则,模式将很乐意仅匹配行的第一个字母(名称是非贪婪的,其他一切都是可选的)。