Regex使用Perl捕获变量中特定的8位字符串
在我的Perl脚本中,我有一个包含特定文件路径的变量。我需要创建一个正则表达式,它可以从该变量中捕获特定的8位字符串 当$file_path=/home/attachments/00883227/sample.txt 我想捕获附件后面的数字字符串 我失败的尝试: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变量中似乎没有存储任何内容。这个问题的
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。