Perl:Regex匹配额外字符串
我有以下字符串大小写:Perl:Regex匹配额外字符串,regex,perl,Regex,Perl,我有以下字符串大小写: my$str=“Warehouse.13.s01e01.hdtv.xor.avi” my$str=“Warehouse.13.01x01.hdtv.xor.avi” my$str=“Warehouse.13.seasion01 eposode01.hdtv.xor.avi” 上述情况下的分隔符()可以替换为\s。现在,为了匹配上述情况,我创建了以下正则表达式,它运行良好: my $regex_object = qr{.*?\d{1,2}(?:e|edosipe)?[.
- my$str=“Warehouse.13.s01e01.hdtv.xor.avi”李>
- my$str=“Warehouse.13.01x01.hdtv.xor.avi”李>
- my$str=“Warehouse.13.seasion01 eposode01.hdtv.xor.avi”李>
)可以替换为\s
。现在,为了匹配上述情况,我创建了以下正则表达式,它运行良好:
my $regex_object = qr{.*?\d{1,2}(?:e|edosipe)?[._\- x]?\d{1,2}(?:s|nosaes)?[._\- ]?(?=\d+)(.*)};
您可以看到,我必须反转字符串来处理\d+
,因为在“向后看”中应该有一个绝对长度匹配,所以我将其转换为“向前看”
现在,对于上述情况,输出为Warehouse 13
,这是我所需的输出
现在的问题是,如果我的系列名称
不包含数字(13,24)
我不希望我上面的正则表达式匹配,并确保我使用了(?=\d+)
即s |季节
前面是否有数字
现在,如果我的$str
是'how.i.met.your.mother.s03e13.hdtv.mkv'
,它将匹配上面的正则表达式并输出
how.i.met.your.mother.s0
现在,我不知道为什么它会匹配这个字符串,甚至在使用了look back之后,以及如何更正它
我不知道它为什么匹配这个字符串
一个可能的解决方案是改变(两者都改变)
到
或
当然,
(?=\d+)
将导致整个系统失败。我不知道它为什么会在那里。也许你的意思是(?!\d+)
?(在这两种情况下,+
都是无用的。)伙计们,如果你们投票反对我,请给出原因。我使用(?=\d+
的原因是我想确保我只匹配那些s|season
用数字来精确计算的字符串。如果我使用(?!\d+
,那么它将匹配上面的how.I…
案例,我不希望它这样做。我认为{m,n}
总是执行贪婪匹配,它的非贪婪版本是{m,n}
。它不匹配30
而只匹配3
的任何原因。我是正则表达式的初学者。它最初确实匹配30
,但这导致(?=\d+)
失败,因此它会返回。但是如果失败,它应该声明此字符串与用户定义的模式不匹配。为什么要回溯,因为当我读到perl正则表达式时,没有提到回溯。你也可以使用\d{1,2}+
aka(?>\d{1,2})
而不是添加(?!\d)
。这将防止这种回溯。
.*? "vkm.vtdh."
\d{1,2} "31"
(?:e|edosipe)? "e"
[._\- x]? ""
\d{1,2} "3"
(?:s|nosaes)? ""
[._\- ]? ""
(?=\d+) "0"
(.*) "0s.rehtom.ruoy.tem.i.woh"
\d{1,2}
\d{1,2}(?!\d) # Don't match just "3" of "30".
# Bonus: Can't match part of "123".
(?>\d{1,2}) # Prevents it from matching just
# one digit if there are two.
# Note: Can match "12" of "123".