如何使regexp I Ruby不需要匹配/可选匹配?
我正在尝试创建一个与部分字符串匹配的regexp。 我不必匹配每个部分,但至少要匹配一个(它总是会匹配) 我想要:姓名、年份和/或季节/插曲 假设我有以下字符串:如何使regexp I Ruby不需要匹配/可选匹配?,ruby,regex,Ruby,Regex,我正在尝试创建一个与部分字符串匹配的regexp。 我不必匹配每个部分,但至少要匹配一个(它总是会匹配) 我想要:姓名、年份和/或季节/插曲 假设我有以下字符串: i、 want.this.as.name.2014.s01e02 2010年我仍然想要一个 我也想要这个 我还是要这个.S05E23.720p.HDTV.X264 我想买这些火柴: 1. name = i.want.this.as.name. year = 2014 seasonepisode = s01e02 seas
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
现在,我有一个regexp:
(?<name>.*)(?<year>\d{4})(\s|\.|\z)*(?<seasonepisode>s(?<season>\d{1,2})e(?<episode>\d{1,2}))*
(?*)(?\d{4})(\s{124;\.\ z)*(?s(?\d{1,2})e(?\d{1,2}))*
但是我只在第一个字符串上得到了期望的结果。我猜这是因为字符串2、3或4中没有与完整regexp匹配的内容
在这里,您可以尝试使用regexp:
所以我的问题是,如何告诉regexp我不需要对所有内容都进行匹配,只需要对某些内容进行匹配?:-)我已经试着将asterix添加到opitonal中
5欧元捐款给您选择的项目/慈善机构,以获得正确答案:-)这可能有用:。使用/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.
^
(?。+?)#名称:至少一个字符,非贪婪。
(?\d{4})?#年份,可选。
(?:#年后的东西,未捕获。
[\s\.]
季节。
e(?\d\d?)#插曲。
(?*)#其余,可选。
)? # 年后的东西是可选的。
$#必须消耗整行。
几点注意:
- 名称组的非贪婪性很重要。否则,它将很高兴地消耗整个行(其他所有内容都是可选的)
- 要求全线比赛也很重要。否则,模式将只匹配行的第一个字母(名称是非贪婪的,其他所有内容都是可选的)