2012-09-16 61 views
4

我想使用正则表达式提取一部分字符串。我有以下情况的字符串: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由数precided(回顾后)和 提取之前的一切,但作为回顾后需要绝对长度我反向的字符串 并在其上使用的前面看。

现在为case1我创建了正常工作的下面的正则表达式,并输出Warehouse.13

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

现在对于案例2我用:

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

现在,当我尝试上述两种情况+可选的分隔符像结合:

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

在你可以观察到上述情况大部分东西都是optinal(?)。这是针对案例3的 。

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

任何想法这里有什么问题。

PS:我知道可能有其他可能的字符串,将违抗上述正则表达式,但 目前我不感兴趣。

+0

在上面的例子中,'Warehouse'位于字符串或行的开头吗? – DavidO

+0

@DavidO:是的文件名以'Warehouse'开头。 – ronnie

回答

5

[e|edosipe][s|nosaes](e|edosipe)(s|nosaes),或(?:e|edopise)(?:s|nosaes)如果你不想正则表达式引擎捕捉到他们弄乱你的$1会计,$2

这里,(...)确实括号很像Perl在其他表达式中的分组。 [...]定义了一个字符类。具体而言,[s|nosaes]一个单个字符匹配任一aenos,和(或许令人惊奇的,但元字符特殊含义通常忽略内部[...]),|

+0

让我试试看。 – ronnie

+1

它的工作:D。所以当我使用''nosaes''时,它特别寻找'n,o,s,a,e,s',而不是把它看作是一个整体世界。 – ronnie

+0

但是在做出上述修改后,它显示case3 :(我的新正则表达式不匹配。*?\ d {1,2}(?: e | edosipe)[._ \ - x]?\ d {1 ,2}(?: s | nosaes)[._ \ - ]?(?= \ d +)(。*)'。 – ronnie

相关问题