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".