Perl:正则表达的困难

时间:2014-07-08 08:29:58

标签: regex perl

我在perl上制作正则表达式有问题,可能有人可以帮助我。 输入字符串:

bss/216476/29/52/9___\000243477___agt-1319.jpg
bss/216476/29/52/9___\000243477___agt-1319_1.jpg
bss/216476/29/52/9___\000243477___agt-1319_2.jpg

我期望获得:

29 52 9 1319或29 52 9 1319 0

29 52 9 1319 1

29 52 9 1319 2

我的正则表达式仅适用于最后2个字符串:

/\/(\d{2})\/(\d{2})\/(\d+).*-(\d+)_(\d{1})/

正如你在第一行看到的那样,没有像_0.jpg那样的图片编号,这是一个问题。 我试过像

那样制作正则表达式
/\/(\d{2})\/(\d{2})\/(\d+).*-((\d+)_(\d{1}))|(\d+)/

但看起来我错了。 谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

使用非捕获组(?:...)?使其成为可选组:

/\/(\d{2})\/(\d{2})\/(\d+).*-(\d+)(?:_(\d{1}))?/

如果在需要包含斜杠的情况下使用不同的分隔符,它也可以清理你的正则表达式。此外,您可以使用/x修饰符,以便为可读性添加间距:

use strict;
use warnings;

while (<DATA>) {
    if (m{ / (\d{2}) / (\d{2}) / (\d+) .*- (\d+) (?:_(\d{1}))? }x) {
        print join(" ", map {$_//''} ($1, $2, $3, $4, $5)), "\n";
    }
}

__DATA__
bss/216476/29/52/9___\000243477___agt-1319.jpg
bss/216476/29/52/9___\000243477___agt-1319_1.jpg
bss/216476/29/52/9___\000243477___agt-1319_2.jpg

输出:

29 52 9 1319
29 52 9 1319 1
29 52 9 1319 2