如何在perl正则表达式中排除0-9

时间:2016-03-30 02:38:27

标签: perl regex-negation

在一次比较中,我试图排除以单个数字结尾的字符串但无法使其工作。

假设:

@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

正则表达式看起来没问题....为什么它不起作用?

2 个答案:

答案 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";