gpt4 book ai didi

regex - 如何重新定义\s以匹配下划线?

转载 作者:行者123 更新时间:2023-12-04 13:38:18 24 4
gpt4 key购买 nike

用于空白的Perl( \s与 [\t\n\f\r ]相同。

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

这仅仅是为了使具有许多 [\s_]的其他复杂的正则表达式具有可读性。我可以这样做吗?如果是这样,怎么办?

最佳答案

每当我认为在Perl中无法实现某些事情时,通常都会证明我是错的。有时,当我认为在Perl中有些困难时,我也是错的。 @sln将我指向right track

尽管可以,但我们暂时不要覆盖\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

第三种情况是证明正则表达式中的 \\_将与文字 \_匹配,就像 \\s将与文字 \s匹配一样。

关于regex - 如何重新定义\s以匹配下划线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31395427/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com