gpt4 book ai didi

regex - perl6 彩色匹配,一些正则表达式插值有效,有些无效;颜色代码不一致

转载 作者:行者123 更新时间:2023-12-03 20:31:07 27 4
gpt4 key购买 nike

我有一些很长的线条,我想用我想要的颜色突出显示匹配项。一个函数使用替换,另一个函数使用递归。有些有效,有些无效;我正在寻找一种一致的方法来插入正则表达式。非常感谢你 !!!

sub colorMatch ($aStr, $aRegex, $aColor) {
my $colorOff = '\e[0m';
my $a =$aStr.subst(/(<{$aRegex}>)/, $aColor ~ "# $/ #" ~ $colorOff, :g);
# not working, $/ not interpolating corresponding matches, all Nil
say $a;
}

colorMatch("a-12-b-3-c-4-def-567", '\d+', '\e[1;31m');
colorMatch("a-12-b-3-c-4-def-567", '<alpha>+', '\e[1;31m');
say "\e[1;31m" ~ " color1 " ~ "\e[0m" ~
"\e[1;36m" ~ " color2 " ~ "\e[0m";

sub colorMatch2 ($aStr, $aRegex, $colorNumber) {
my $colorOff = "\e[0m";
if $aStr.chars > 0 {
my $x1 = ($aStr ~~ m/<{$aRegex}>/);
my $x2 = $x1.prematch;
my $x3 = $x1.Str;
my $x4 = $x1.postmatch;
return ($x2 ~ "\e[1;{$colorNumber}m" ~ $x3 ~ $colorOff)
~ colorMatch2($x4, $aRegex, $colorNumber);
}
}

say colorMatch2("a-12-b-3-c-4-def-567", '\d+', 31); # works, red color
say colorMatch2("a-12-b-3-c-4-def-567", '567', 36); # works, green color
say colorMatch2("a-12-b-3-c-4-def-567", '\w+', 31); # works, red color
say colorMatch2("a-12-b-3-c-4-def-567", '[a..z]+', 31); # fails with [] and ..
say colorMatch2("a-12-b-3-c-4-def-567", "<alpha>+", 31); # fails with <>


Use of Nil in string context
in sub colorMatch at colorMatch.pl line 4
a-\e[1;31m# #\e[0m-b-\e[1;31m# #\e[0m-c-\e[1;31m# #\e[0m-def-\e[1;31m# #\e[0m

# seems to do substitution, but $/ is empty and color not shown;

Use of Nil in string context
in sub colorMatch at colorMatch.pl line 4
\e[1;31m# #\e[0m-12-\e[1;31m# #\e[0m-3-\e[1;31m# #\e[0m-4-\e[1;31m# #\e[0m-567

# seems to do substitution, but $/ is empty and color not shown;

color1 color2 # both colors work and shown as expected,
# color1 red and color 2 green; why inconsistent with above???

a-12-b-3-c-4-def-567 # works, red color
a-12-b-3-c-4-def-567 # works, green color
a-12-b-3-c-4-def-567 # works, red color
No such method 'prematch' for invocant of type 'Bool'
in sub colorMatch2 at colorMatch.pl line 17
in block <unit> at colorMatch.pl line 28

最佳答案

这不是插值问题。字符类和范围的语法略有不同。你需要:

'text' ~~ / <[a..z]>+ /

至于您关于调用 prematch() 的其他错误在 bool 值上,结果是 False因为在最终的递归级别,它不再匹配。在假设它匹配之前,您需要检查结果。

最后,对于“在字符串上下文中使用 Nil”,这是因为您使用的是 Str.subst ,和大多数语言中的大多数函数调用一样,参数在函数开始之前被评估。您正在使用 $/在一个参数中,但它尚未设置,因为函数的主体甚至还没有开始执行。 s/match/replacement/运算符(operator)不会遇到这个困难,所以我建议您将代码更改为:
$aStr ~~ s:g/(<$aRegex>)/$aColor# $/ #$colorOff/;

(或者为了更好的可读性:)
$aStr ~~ s:g {(<$aRegex>)} = "$aColor# $/ #$colorOff";

这假设您已经制作了 $aRegex进入正则表达式而不是字符串。另外,由于新代码修改了 $aStr ,您需要更改 $aStr$aStr is copy在函数签名中。

关于regex - perl6 彩色匹配,一些正则表达式插值有效,有些无效;颜色代码不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46336363/

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