n.r*_*.r. 6 regex perl character-class
\s用于空格的Perl(<v5.18)正则表达式字符类与[\t\n\f\r ].
现在,由于某些文件名使用下划线作为空格,我想知道是否可以重新定义\s(本地)以匹配除空格之外的下划线.
这仅仅是为了具有许多其他复杂的正则表达式的可读性[\s_].我可以这样做吗?如果是这样,怎么样?
mob*_*mob 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;
Run Code Online (Sandbox Code Playgroud)
现在在你的脚本中说
use myspace;
Run Code Online (Sandbox Code Playgroud)
现在\_用正则表达式意味着[\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
Run Code Online (Sandbox Code Playgroud)
输出:
match[3]: aaa\_ccc.txt
match[1]: cccaaa bbb.txt
match[2]: cccaaa bbb.txt
match[2]: aaa_bbb.txt
Run Code Online (Sandbox Code Playgroud)
第三种情况是证明\\_在正则表达式中将匹配文字\_,就像\\s匹配文字一样\s.
| 归档时间: |
|
| 查看次数: |
228 次 |
| 最近记录: |