6

空格的Perl (< v5.18) 正则表达式字符类\s[\t\n\f\r ].

现在,由于某些文件名使用下划线作为空格,我想知道是否可以重新定义\s(本地)以匹配除空格之外的下划线。

这仅仅是为了便于阅读具有许多[\s_]. 我可以这样做吗?如果是这样,怎么做?

4

1 回答 1

12

每当我认为某些事情在 Perl 中是不可能的,通常结果证明我错了。有时当我认为 Perl 中的某些事情非常困难时,我也错了。@sln 为我指明了正确的轨道

让我们暂时不要覆盖\s,尽管你可以。为了您的程序的继承者希望\s表示特定的含义,让我们将序列定义为表示正则表达式中\_的“任何空白字符或字符”。_详细信息在上面的链接中,但实现如下所示:

package myspace;  # redefine  \_  to mean  [\s_]
use overload;
my %rules = ('\\' => '\\\\', '_' => qr/[\t\n\x{0B}\f\r _]/ );
sub import {
    die if @_ > 1;
    overload::constant 'qr' => sub {
        my $re = shift;
        $re =~ s{\\(\\|_)}{$rules{$1}}gse;
        return $re;
    };
}
1;

现在在你的脚本中,说

use myspace;

现在\_在正则表达式中表示[\s_].

演示:

use myspace;
while (<DATA>) {
    chomp;
    if ($_ =~ /aaa\s.*txt/) {      # match whitespace
        print "match[1]: $_\n";
    }
    if ($_ =~ /aaa\_.*txt/) {      # match [\s_]
        print "match[2]: $_\n";
    }
    if ($_ =~ /\\_/) {             # match literal  '\_'
        print "match[3]: $_\n";
    }
}
__DATA__
aaabbb.txt
aaa\_ccc.txt
cccaaa bbb.txt
aaa_bbb.txt

输出:

match[3]: aaa\_ccc.txt
match[1]: cccaaa bbb.txt
match[2]: cccaaa bbb.txt
match[2]: aaa_bbb.txt

第三种情况是为了证明\\_在正则表达式中会匹配一个字面量\_,like\\s会匹配一个字面量\s

于 2015-07-14T01:26:52.527 回答