正则表达式hackery

时间:2009-06-12 18:01:23

标签: regex string

我一直在考虑一个可以转换这样一个列表的正则表达式:

1. 10.Things.I.Hate.About.You[1999]DvDrip[Eng]-Ray 699.68 MB 
2. 100.Feet.2008.DvDRip-FxM 701.14 MB 
3. 11 - 14 1 286.22 MB 
4. 13_going_on_30(2004)[Brizzly] 700.23 MB 
...
1 523. Waz 699.93 MB 
1 524. We.Own.the.Night[2007]DvDrip[Eng]-Ray 700.87 MB 
1 525. Webs [2003]DVDRip[Xvid AC3[5.1]-RoCK&BlueLadyRG 1 347.70 MB 

成:

10.Things.I.Hate.About.You[1999]DvDrip[Eng]-Ray,699.68 MB
100.Feet.2008.DvDRip-FxM,701.14
11 - 14,1286.22
13_going_on_30(2004)[Brizzly],700.23 
...
Waz,699.93
We.Own.the.Night[2007]DvDrip[Eng]-Ray,700.87
Webs [2003]DVDRip[Xvid AC3[5.1]-RoCK&BlueLadyRG,1347.70

假设:文件大小永远不会> 9999.99MB

到目前为止,我有一个部分工作的正则表达式:

^[^\.]+\. (.+?) (?:([0-9])(?: ))?([0-9]+\.[0-9]{2}) MB.*$

映射到

$1:$2$3

完成转型。

我使用了冒号,因为没有桌面操作系统允许在文件名中使用冒号,所以我很安全。

我没有任何形式的方法(即通过使用直觉)构建了正则表达式,并且同样的直觉告诉我这个正则表达式是非常复杂和缓慢的!

我希望RegExBuddy有一个在线版本或类似的东西。

如何构建更好的RegEx?提示,提示......

是否有任何免费/开放工具可以让我描述我的正则表达式(除了编写Perl脚本)?

3 个答案:

答案 0 :(得分:2)

我使用The Regex Coach

答案 1 :(得分:2)

Perl:

#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

while ( <DATA> ) {
    no warnings 'uninitialized';
    next unless /^[^.]+\. (.+?) (?:(\d+) )?(\d+(?:.\d+)?) MB$/ ;
    print "$1,$2$3\n";
}

__DATA__
1. 10.Things.I.Hate.About.You[1999]DvDrip[Eng]-Ray 699.68 MB
2. 100.Feet.2008.DvDRip-FxM 701.14 MB
3. 11 - 14 1 286.22 MB
4. 13_going_on_30(2004)[Brizzly] 700.23 MB
...
1 523. Waz 699.93 MB
1 524. We.Own.the.Night[2007]DvDrip[Eng]-Ray 700.87 MB
1 525. Webs [2003]DVDRip[Xvid AC3[5.1]-RoCK&BlueLadyRG 1 347.70 MB

输出:

C:\Temp> zcx
10.Things.I.Hate.About.You[1999]DvDrip[Eng]-Ray,699.68
100.Feet.2008.DvDRip-FxM,701.14
11 - 14,1286.22
13_going_on_30(2004)[Brizzly],700.23
Waz,699.93
We.Own.the.Night[2007]DvDrip[Eng]-Ray,700.87
Webs [2003]DVDRip[Xvid AC3[5.1]-RoCK&BlueLadyRG,1347.70

答案 2 :(得分:0)

“我使用了冒号,因为没有桌面操作系统允许在文件名中使用冒号,所以我很安全。”

很好的尝试。它在GNU / Linux下是允许的。

更重要的是,您只提供了示例。您尚未描述要执行的正则表达式。你也有明显无意义的结构,比如(?:),它可能只是一个空格。

最后,目前还不清楚冒号实际扮演什么角色,因为它不在你的替代文本中。如果你告诉我们你正在使用什么语言,也许会有所帮助。