0

我有以下字符串案例:

  • 我的 $str = "Warehouse.13.s01e01.hdtv.xor.avi";
  • 我的 $str = "Warehouse.13.01x01.hdtv.xor.avi";
  • 我的 $str = "Warehouse.13.season01episode01.hdtv.xor.avi";

上述情况下的 delimiter( .) 可以替换为_ - \s. 现在为了匹配上述情况,我创建了以下正则表达式,它工作正常:

my $regex_object = qr{.*?\d{1,2}(?:e|edosipe)?[._\- x]?\d{1,2}(?:s|nosaes)?[._\- ]?(?=\d+)(.*)};

您可以看到我必须反转要处理的字符串,\d+因为在后视中应该有绝对长度匹配,所以我将其转换为前瞻。

现在对于上述情况,输出Warehouse 13是我需要的输出。

现在的问题是,如果我series name不包含numbers(13,24)我不希望我上面的正则表达式匹配并确保我使用了(?=\d+)i,e ifs|season前面是否有数字。

现在,如果我$str的 is'how.i.met.your.mother.s03e13.hdtv.mkv'它匹配上面的正则表达式和输出

how.i.met.your.mother.s0

现在,我不知道为什么即使在使用后视以及如何纠正它之后它仍然匹配这个字符串。

4

1 回答 1

2

我不知道为什么它匹配这个字符串

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

当然,那么这(?=\d+)将导致整体失败。我不知道为什么它首先存在。也许你的意思是(?!\d+)?(在这两种情况下,+都是无用的。)

于 2012-09-24T17:50:06.313 回答