在我的Perl脚本中,我有一个包含特定文件路径的变量。我需要创建一个正则表达式,可以从该变量中捕获特定的8位数字符串。
$file_path = "/home/attachments/00883227/sample.txt
时
我想在“附件”之后立即捕获数字串。
我的(不成功)尝试:
if($file_path =~ /attachments\/(\d{1,2,3,4,5,6,7,8}+)/)
{ $number = $1; }
但是,当我运行此脚本时,看起来好像没有存储在$ number变量中。解决方案可能非常简单?请原谅我的无知,我对Perl很新。
答案 0 :(得分:5)
你不需要在括号中提供这么多数字。只需使用{8}
强制匹配8位数字即可。由于你的字符串中有/
,你可以使用不同的分隔符,而不是转义斜杠:
if($file_path =~ m!attachments/(\d{8})!)
{ $number = $1; }
答案 1 :(得分:5)
关闭,只需使用(\d{8})
,例如:
$file_path =~ /attachments\/(\d{8})\b/
还添加了\b
,以便它不会捕获更长的数字。
答案 2 :(得分:3)
如果您想完全匹配8位数,请使用\d{8}
:
if($file_path =~ /attachments\/(\d{8})/)
{ $number = $1; }
答案 3 :(得分:3)
my ($number) = ( $file_path =~ m{ (attachments/( [0-9]{8} ) }x );
使用/
之外的模式分隔符,例如m{ }
,可以避免因需要转义和/
字符而导致的所谓倾斜牙签综合征出现在模式中。
通过在列表上下文中分配$number
,捕获的子字符串立即进入$number
。
通过使用x
选项,可以使您的模式更具可读性。
答案 4 :(得分:1)
尝试使用:
if($file_path =~ /attachments\/(\d+)/)
{ $number = $1; }
{ , }
用于限制重复某个字符(或一组字符)的次数。 {n,m}
表示字符(或组)应重复至少n次,最多m次。
如果您确定数字字符串的长度为8位,则使用:
if($file_path =~ /attachments\/(\d{8})/)
{ $number = $1; }
{ }
(不带逗号)将与指定的数字完全匹配。
答案 5 :(得分:1)
my ($number) = $file_path =~ m{attachments/(\d+)};
如果你想确保它长到八位数,
my ($number) = $file_path =~ m{attachments/(\d{8})(?!\d)};
答案 6 :(得分:0)
它是8位还是1到8位?
由于您将/attachments/
视为字符串的一部分,因此您可能不希望使用标准/../
分隔符。也许切换到m{..}
或m#..#
:
if ( $file_path =~ m#/attachments/\(d{1,8})/# ) {
这将捕获1至8位数字。准确捕捉8:
my $number;
if ( $file_path =~ m#/attachments/(\d{8})/# ) {
$number = $1;
...
}
else {
....
}
请注意,我在$digit_string
语句之前定义if
。这样,它就在if
语句之后(以及if
语句中的范围内。(您正在使用use strict;
?对吗?)