在一次比较中,我试图排除以单个数字结尾的字符串但无法使其工作。
假设:
@drives = ("sda", "sda1", "sda2", "sdb", "sdb1", "dm", "dm-0");
for $part (@drives)
{
if ($part =~ /sd.[^0-9]/)
{
print "\tBase: $part\n";
}
}
正则表达式/sd.[^0-9]/
应仅匹配sda和sdb。输出应为:
Base: sda
Base: sdb
正则表达式看起来没问题....为什么它不起作用?
答案 0 :(得分:1)
对于正则表达式问题,答案很简单!
如果/sd.[^0-9]/
,您的表达式sd
将返回匹配,后跟除换行符之外的任何字符,后跟除ASCII 0
到{{1}之外的任何字符在字符串
您必须将模式锚定到字符串的开头和结尾,以确保9
出现在开头,而非数字字符出现在结尾处。您还应该使用sd
来允许零个或多个中间字符
该程序显示结果
.*
use strict;
use warnings 'all';
my @drives = qw/ sda sda1 sda2 sdb sdb1 dm dm-0 /;
for my $part ( @drives ) {
if ( $part =~ /^sd.*[^0-9]$/ ) {
print "\tBase: $part\n";
}
}
请注意,像这样编写测试可能会更容易,也更清晰
Base: sda
Base: sdb
答案 1 :(得分:-1)
你的正则表达式因为正则表达式尝试匹配四个字符而无法正常工作。
使用负面预测来做到这一点
@drives = ("sda", "sda1", "sda2", "sdb", "sdb1", "dm", "dm-0");
for $part (@drives)
{
if ($part =~m/sd.(?!\d+)/)
{
print "\tBase: $part\n";
}
}
使用grep替换而不是
@drives = ("sda", "sda1", "sda2", "sdb", "sdb1", "dm", "dm-0");
my @ac = grep{ s/(sd.)(?!\d)/\tBase : $1\n/; } @drives;
print @ac;
print "\n";