正则表达式使用Perl捕获变量中的特定8位字符串

时间:2013-07-05 18:56:37

标签: regex perl

在我的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很新。

7 个答案:

答案 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;?对吗?)