我在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+)/
但看起来我错了。 谢谢你的帮助。
答案 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