Perl:为什么我的正则表达式不匹配

时间:2012-09-16 07:06:07

标签: regex perl

我正在尝试使用正则表达式提取字符串的一部分。我对字符串有以下情况:

case1: Warehouse.13.season01episode01.hdtv.xor.avi
case2: Warehouse.13.s01e01.hdtv.xor.avi
case3: Warehouse.13.01x01.hdtv.xor.avi

上述字符串中的delimter(.)可以由\s - _替换。

我正在使用的逻辑是检查s or season是否按数字预先(lookbehind) 在它之前提取所有东西,但由于后视需要绝对长度,我颠倒了字符串 并用它向前看。

现在对于case1我创建了以下正则表达式,它正常工作并输出Warehouse.13

.*?\d{1,2}e\d{1,2}s\.(?=\d+)(.*)

现在我使用了case2:

.*?\d{1,2}edosipe\d{1,2}nosaes\.(?=\d+)(.*) # works fine.

现在,当我尝试将上述两种情况+可选的分隔符组合起来时,如:

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

在上述情况下,您可以观察到大部分内容都是视觉上的(?)。这是为了 情形3。

使用上述正则表达式与case2的任何内容都不匹配,但适用于case1和case3。

知道这里有什么问题。

PS:我知道可能还有其他可能的字符串会违反上述正则表达式但是 目前对他们不感兴趣。

1 个答案:

答案 0 :(得分:5)

如果您不希望使用正则表达式引擎,则

[e|edosipe][s|nosaes]应为(e|edosipe)(s|nosaes),或(?:e|edopise)(?:s|nosaes)抓住他们并弄乱你的会计$1$2

在这里,(...)进行括号分组,就像在Perl中的任何其他表达式中一样。 [...]定义了一个字符类。具体来说,[s|nosaes]匹配单个字符aenos,并且(可能令人惊讶,但是元字符特殊含义通常在[...])|内被忽略。