[英]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.