繁体   English   中英

Perl:正则表达式的困难

[英]Perl: difficulties with regular expression

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

我的Regex仅适用于最后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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM