Regex使用Perl捕获变量中特定的8位字符串

Regex使用Perl捕获变量中特定的8位字符串,regex,perl,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脚本中,我有一个包含特定文件路径的变量。我需要创建一个正则表达式,它可以从该变量中捕获特定的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非常陌生。

如果您想精确匹配8位数字,只需使用\d{8}:


如果要精确匹配8位数字,只需使用\d{8}:

尝试使用:

if($file_path =~ /attachments\/(\d+)/)
{ $number = $1; }
{,}用于限制某个字符或一组字符重复的次数。{n,m}表示字符或组应至少重复n次,最多重复m次

如果确定数字串的长度为8位,则使用:

if($file_path =~ /attachments\/(\d{8})/)
{ $number = $1; }
{}不带逗号将与指定的数字完全匹配。

尝试使用:

if($file_path =~ /attachments\/(\d+)/)
{ $number = $1; }
{,}用于限制某个字符或一组字符重复的次数。{n,m}表示字符或组应至少重复n次,最多重复m次

如果确定数字串的长度为8位,则使用:

if($file_path =~ /attachments\/(\d{8})/)
{ $number = $1; }

{}不带逗号将与指定的数字完全匹配。

不需要在大括号中给出太多数字。只需使用{8}强制8位数字的匹配。由于字符串中有/,因此可以使用不同的分隔符,而不是转义斜杠:

if($file_path =~ m!attachments/(\d{8})!)
   { $number = $1; }

你不需要在大括号里写那么多数字。只需使用{8}强制8位数字的匹配。由于字符串中有/,因此可以使用不同的分隔符,而不是转义斜杠:

if($file_path =~ m!attachments/(\d{8})!)
   { $number = $1; }
使用除/以外的模式定界符,例如m{},可以避免由于需要转义和/模式中出现的字符而导致的所谓的倾斜牙签综合症

通过在列表上下文中分配给$number,捕获的子字符串立即进入$number

通过使用x选项,您可以使模式更具可读性

使用除/以外的模式定界符,例如m{},可以避免由于需要转义和/模式中出现的字符而导致的所谓的倾斜牙签综合症

通过在列表上下文中分配给$number,捕获的子字符串立即进入$number

通过使用x选项,您可以使模式更具可读性。

关闭,只需使用\d{8},如:

还添加了\b,这样它就不会捕获更多的数字。

关闭,只需使用\d{8},如:


还添加了\b,这样它就不会捕获任何更长的数字。

它将恰好是8位数字还是介于1到8位之间

由于您将/attachments/视为字符串的一部分,因此可能不希望使用标准的/。/分隔符。可能会切换到m{..}或m..:

这将捕获1到8个数字。要准确捕获8个:

my $number;
if ( $file_path =~ m#/attachments/(\d{8})/# ) {
   $number = $1;
   ...
}
else {
    ....
}

注意,我在if语句之前定义了$digit_字符串。这样,它在if语句之后的范围内,在if语句内部。您正在使用use strict;?对吗?

它是正好是8位还是介于1到8位之间

由于您将/attachments/视为字符串的一部分,因此可能不希望使用标准的/。/分隔符。可能会切换到m{..}或m..:

这将捕获1到8个数字。要准确捕获8个:

my $number;
if ( $file_path =~ m#/attachments/(\d{8})/# ) {
   $number = $1;
   ...
}
else {
    ....
}
注意,我在if语句之前定义了$digit_字符串。这样,它在if语句之后的范围内,在if语句内部。您正在使用use strict;?对吧?

如果你想确保它的长度正好是8位数

my ($number) = $file_path =~ m{attachments/(\d{8})(?!\d)};
如果你想确保它的长度正好是8位数

my ($number) = $file_path =~ m{attachments/(\d{8})(?!\d)};

你忘记了8位数的要求。@Barmar OP在他们的正则表达式中使用了+,这与他们所说的不太一致,但我想如果OP对正则表达式不太了解,这是很自然的……你忘记了8位数的要求。@Barmar OP在他们的正则表达式中使用了+,这与他们所说的不太一致,虽然我想如果OP对regex不太了解,这是很自然的…in-perldoc perlretut应该会有帮助。in-perldoc perlretut应该会有帮助。感谢您的回复-工作非常完美!我也喜欢\b。感谢您的回复-效果非常好!我也喜欢\b。