如何在自定义字符class中插入变量?
How to insert variable in user-defined character class?
我想做的是允许程序根据遇到的文本定义字符 class。但是,<[]> 按字面意思接受字符,以下会产生错误:
my $all1Line = slurp "htmlFile";
my @a = ($all1Line ~~ m:g/ (\" || \') ~ [=11=] {} :my $marker = [=11=]; http <-[ $marker ]>*? page <-[ $marker ]>*? /); # error: $marker is taken literally as $ m a r k e r
我想匹配格式为“https://foo?page=0?ssl=1”或'http ... page ...'
的所有链接
根据您的示例代码和文本,我不完全确定您的源数据是什么样的,因此我无法提供更详细的信息。也就是说,根据如何匹配匹配早期部分的字符,最简单的方法是使用数组匹配:
my $input = "(abc)aaaaaa(def)ddee(ghi)gihgih(jkl)mnmnoo";
my @output = $input ~~ m:g/
:my @valid; # initialize variable in regex scope
'(' ~ ')' $<valid>=(.*?) # capture initial text
{ @valid = $<valid>.comb } # split the text into characters
$<text>=(@valid+) # capture text, so long as it contains the characters
/;
say @output;
.say for @output.map(*<text>.Str);
其输出为
[「(abc)aaaaaa」
valid => 「abc」
text => 「aaaaaa」 「(def)ddee」
valid => 「def」
text => 「ddee」 「(ghi)gihgih」
valid => 「ghi」
text => 「gihgih」]
aaaaaa
ddee
gihgih
或者,您可以将整个字符 class 定义存储在一个变量中并将该变量引用为 <$marker-char-class>
,或者如果您想避免这种情况,您可以将其全部内联定义为代码被解释为 <{ '<[' ~ $marker ~ ']>' }>
的正则表达式。请注意,both 方法都存在相同的问题:您正在从正则表达式语法构造字符 class,这可能需要转义字符或特定的顺序,因此绝对是次优。
如果这是您经常做的事情而不是临时性的,您也可以定义自己的正则表达式方法标记,但这可能太过分了,作为它自己的问题会更好。
我想做的是允许程序根据遇到的文本定义字符 class。但是,<[]> 按字面意思接受字符,以下会产生错误:
my $all1Line = slurp "htmlFile";
my @a = ($all1Line ~~ m:g/ (\" || \') ~ [=11=] {} :my $marker = [=11=]; http <-[ $marker ]>*? page <-[ $marker ]>*? /); # error: $marker is taken literally as $ m a r k e r
我想匹配格式为“https://foo?page=0?ssl=1”或'http ... page ...'
的所有链接根据您的示例代码和文本,我不完全确定您的源数据是什么样的,因此我无法提供更详细的信息。也就是说,根据如何匹配匹配早期部分的字符,最简单的方法是使用数组匹配:
my $input = "(abc)aaaaaa(def)ddee(ghi)gihgih(jkl)mnmnoo";
my @output = $input ~~ m:g/
:my @valid; # initialize variable in regex scope
'(' ~ ')' $<valid>=(.*?) # capture initial text
{ @valid = $<valid>.comb } # split the text into characters
$<text>=(@valid+) # capture text, so long as it contains the characters
/;
say @output;
.say for @output.map(*<text>.Str);
其输出为
[「(abc)aaaaaa」
valid => 「abc」
text => 「aaaaaa」 「(def)ddee」
valid => 「def」
text => 「ddee」 「(ghi)gihgih」
valid => 「ghi」
text => 「gihgih」]
aaaaaa
ddee
gihgih
或者,您可以将整个字符 class 定义存储在一个变量中并将该变量引用为 <$marker-char-class>
,或者如果您想避免这种情况,您可以将其全部内联定义为代码被解释为 <{ '<[' ~ $marker ~ ']>' }>
的正则表达式。请注意,both 方法都存在相同的问题:您正在从正则表达式语法构造字符 class,这可能需要转义字符或特定的顺序,因此绝对是次优。
如果这是您经常做的事情而不是临时性的,您也可以定义自己的正则表达式方法标记,但这可能太过分了,作为它自己的问题会更好。