4

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

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按数字预先确定(后视)并提取它之前的所有内容,但由于后视需要绝对长度,我反转了字符串并使用前瞻。

现在对于 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+)(.*)

在上述情况下,您可以观察到大多数事情都是可选的(?)。它适用于case3。

使用上面的正则表达式与 case2 不匹配,但对 case1 和 case3 工作正常。

知道这里有什么问题。

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

4

1 回答 1

5

[e|edosipe]and[s|nosaes]应该是(e|edosipe)and ,(s|nosaes)或者如果您不希望正则表达式引擎捕获它们并弄乱您对 , 等的会计处理。(?:e|edopise)(?:s|nosaes)$1$2

在这里,(...)括号分组很像在 Perl 中的任何其他表达式中所做的。 [...]定义一个字符类。具体来说,[s|nosaes]匹配单个字符,它是a, e, n, o, s, 和(可能令人惊讶,但元字符的特殊含义通常在[...] 中被忽略)|、。

于 2012-09-16T07:19:30.837 回答