Regex Perl:正则表达式的困难

Regex Perl:正则表达式的困难,regex,perl,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 2952913191 2952913192 我的正则表达式仅适

我在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

2952913191

2952913192

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

/\/(\d{2})\/(\d{2})\/(\d+).*-(\d+)_(\d{1})/
正如您在第一行中所看到的,没有像_0.jpg这样的图片编号,这是一个问题。 我试着让正则表达式像

/\/(\d{2})\/(\d{2})\/(\d+).*-((\d+)_(\d{1}))|(\d+)/
但看起来我错了。
谢谢您的帮助。

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

/\/(\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